質問: ### 前提・実現したいこと プリグラミング初心者です。初めて質問します。 Railsにて簡単なアプリを作成するために、データベース、テーブルを作成して コンソール(rails c)からデータを入力したところ、エラーが発生してしまいました。 コンソールから値を入力して、データベースにて確認したいのですが、どこに問題があるのかわかりません。 ### 発生している問題・エラーメッセージ ``` NameError: uninitialized constant StoreData from /Users/arataku/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/active_support.rb:79:in `block in load_missing_constant' Caused by NameError: uninitialized constant StoreData from /Users/arataku/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/active_support.rb:60:in `block in load_missing_constant' 入力したコマンド pry(main)> StoreData.create(name: "aaa", adress: "bbb", text: "ccc") ``` ### 該当のソースコード ``` class CreateStoreData < ActiveRecord::Migration[5.2] def change create_table :store_data do |t| t.string :name t.string :adress t.string :text t.text :image t.timestamps end end end ``` ### 試したこと NameError: uninitialized constant StoreDataという事なので StoreDataクラスが読み込めませんよ、と言っているだろうと推測できます。いろいろ調べましたが解決策が見つかりませんでした。 よろしくお願いします。 ### 補足情報(FW/ツールのバージョンなど) ruby '2.5.1' gem 'rails', '~> 5.2.3' gem 'mysql2', '0.5.3' ※質問の仕方等、問題がありましたらご指摘頂けるとありがたいです。
回答: 「 調べたところ、テーブル名に_(アンダーバー)を入れる際は、複数形にするという命名規則があるみたいです。 なので今回の場合は、テーブル名をstores_datasにしておけば良かったのかなと思いました。 しかし命名規則に則ってないだけでエラーは出るものなのかなという疑問が残りました。 」 ここは違います。 まず、命名「規則」 ではなく 「規約」 です。 規約に従っていれば 宣言や定義をしなくても済む というものです。 宣言がない場合は規約通りの命名がされていると解釈しますので、定義がないというエラーになったわけです。 モデル名は単数形、DBのtable名は複数形 という規約に従わなくても宣言をすれば使えます。( アンダーバーを入れるか否かは関係ないです) たとえば ``` class StoreData table_name = "store_data" end ``` とすればエラーは起きません。 なお、、、、 もっと規約に準じるなら class StoreDatum で table名が store_data です。 dataは複数形で単数形がdatumなので けっこうややこしいclass名を使ってしまったということに、、、 なお、 rails generate model StoreData とすると、規約にそった命名で class、migrationが作成されます class StoreDatum と table名 store_data で