Railsでモデルを作成後、テスト用のデータを入れようとしたところ
uninitialized constant 〇〇 (NameError)
というエラーが発生しました。
結論
モデル名にスペルミスなどがなく原因が見当たらない場合は
reload!
を試す。
状況
以下のコマンドでモデルを作成しました。
$ rails g model Job catch_copy:string work_location:string
invoke active_record
create db/migrate/20230307234229_create_jobs.rb
create app/models/job.rb
invoke test_unit
create test/models/job_test.rb
create test/fixtures/jobs.yml
$ rails db:migrate
== 20230307234229 CreateJobs: migrating =======================================
-- create_table(:jobs)
-> 0.0500s
== 20230307234229 CreateJobs: migrated (0.0501s) ==============================
その後、rails console で以下のようにテストデータを入れようとしたところ、エラーが発生しました。
irb(main):017:0> job = Job.new(catch_copy: "キャベツの収穫", work_location: "群馬県")
(irb):17:in `<main>': uninitialized constant Job (NameError)
「uninitialized constant」で検索したところ、モデル作成時にスペルを間違えていることなどが主な原因と書いてある記事がいくつかありました。
ですが、モデル名は単数形でいいはずですし、スペルも間違えていないので原因がわかりませんでした。
対処
もう少し調べると、こちらのteratailの質問で同じエラーにハマった方がいました。
回答に
rails consoleにてreload!を実行すると改善するかもしれません。
とあり試してみました。
irb(main):018:0> reload!
Reloading...
=> true
irb(main):019:0> job = Job.new(catch_copy: "キャベツの収穫", work_location: "群馬県")
=>
#<Job:0x000000010805b640
...
irb(main):020:0> job.save
TRANSACTION (0.3ms) BEGIN
Job Create (4.2ms) INSERT INTO `jobs` (`catch_copy`, `work_location`, `created_at`, `updated_at`) VALUES ('キャベツの収穫', '群馬県', '2023-03-08 00:15:26.462469', '2023-03-08 00:15:26.462469')
TRANSACTION (4.4ms) COMMIT
=> true
trueとなり、MySQLでデータを確認してみました。
mysql> select * from jobs;
+----+-----------------------+---------------+----------------------------+----------------------------+
| id | catch_copy | work_location | created_at | updated_at |
+----+-----------------------+---------------+----------------------------+----------------------------+
| 1 | キャベツの収穫 | 群馬県 | 2023-03-08 00:15:26.462469 | 2023-03-08 00:15:26.462469 |
+----+-----------------------+---------------+----------------------------+----------------------------+
1 row in set (0.01 sec)
無事データがきちんと入りました。
モデル名にスペルミスなどが明らかにない場合は
reload!
を試してみましょう。