0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsで「uninitialized constant 〇〇 (NameError)」が出たときの対処法

Last updated at Posted at 2023-03-08

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!

を試してみましょう。

参考

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?