web-dev-qa-db-ja.com

NameError:初期化されていない定数(Rails)

PhoneNumberという単純なモデルがあります。

class PhoneNumber < ActiveRecord::Base
  validates :pnumber, presence: true, on: :create #=> { :message => " cannot be blank" }
  validates :pnumber, numericality: true, on: :create
end

アプリケーションのルートフォルダー(アプリのサブフォルダーを含むフォルダー)に移動し、コンソールを起動します。

Rails console --sandbox

空のPhoneNumberを作成しようとすると(検証が失敗するため、エラーメッセージを取得したい)、次のエラーメッセージが表示されます。

2.0.0-p451 :001 > PhoneNumber.new
NameError: uninitialized constant PhoneNumber
from (irb):1
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/commands/console.rb:90:in `start'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/commands/console.rb:9:in `start'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/commands/commands_tasks.rb:69:in `console'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/commands/commands_tasks.rb:40:in `run_command!'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/commands.rb:17:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/app_Rails_loader.rb:43:in `require'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/app_Rails_loader.rb:43:in `block in exec_app_Rails'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/app_Rails_loader.rb:32:in `loop'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/app_Rails_loader.rb:32:in `exec_app_Rails'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/lib/Rails/cli.rb:5:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/bin/Rails:9:in `require'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/gems/railties-4.1.5/bin/Rails:9:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/bin/Rails:23:in `load'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/bin/Rails:23:in `<main>'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/bin/Ruby_executable_hooks:15:in `eval'
from /Users/nnikolo/.rvm/gems/Ruby-2.0.0-p451@railstutorial_Rails_4_0/bin/2.2.2.02.02.02.0.2.2.02.222222.2.02.02.0.2.2.022222222222222

コンソールはモデルを認識していないようです。プレーンRubyでは、クラスを含むファイルを「必要」にする必要がありますが、Railsコンソールはすべてのモデルを自動的にロードするものと考えました。ここで何が起こっていますか?

29
Nick

試すべきこと:

  1. Railsコンソールを再起動します。モデルへの変更は、> reload!を実行した場合(これは予測不可能であることがわかったが)、またはコンソールを再起動した場合に既に開いているRailsコンソールによってのみ反映されます。

  2. モデルファイルは「phone_number.rb」と呼ばれ、「/ app/models」にありますか?

  3. Railsコンソールコマンドの「--sandbox」オプションを再確認する必要があります。私の知る限り、これは変更を防ぎます。スイッチなしで試してください。

47
Dan Laffan

エラーが発生していました:

NameError: uninitialized constant

その後、誤って複数のモデルを作成したことに気付いたので、戻ってモデルファイルの名前を特異に変更し、モデルファイルのクラス名を特異に変更して解決しました。

23
killscreenmike

Rails 5.1から5.2にアップグレードした後にこの問題が発生し始めました
次の方法で解決しました:

spring stop
spring binstub --all
spring start
Rails s
5
user9869932

modelsディレクトリに直接ファイルがある状態でもこれに遭遇しましたが、起動時にコードを適切にロードしていないことがわかりました。 development.rbファイルにconfig.eager_load = trueを設定することで問題を修正できました。これにより、コンソールでクラスを利用できるようになりました

5
bradley2w1dl

@ Michael-Nealと同様です。

コントローラーを単数と名付けました。 app/controllers/product_controller.rb

複数に名前を変更すると、エラーが解決しました。 app/controllers/products_controller.rb

2
Uğur Aldanmaz

上記のどれもうまくいかない場合、実際のシナリオで私に起こったように、私は別のアプローチも持っています。

より具体的には、自動生成されたRubyファイルを Thrift から使用します。


私の状況では、いくつかのクラスを持つModuleがあったため、この場合は順序が重要です

Class Aは、同じモジュールのClass Bを使用します。ただし、Class Bが宣言されましたafterClass A

Class Bを宣言するbeforeClass Aを作成するだけで問題が解決しました。

1
Matheus Felipe

モデルのクラスの名前を変更し、ファイルの名前と一致しなかったため、この問題が発生しました。

「モデルクラス名はCamelCaseを使用します。これらは単数形であり、複数のデータベーステーブル名に自動的にマッピングされます。

モデルファイルはapp/models /#{singular_model_name} .rbに保存されます。」

https://Gist.github.com/iangreenleaf/b206d09c587e8fc6399e#model

1
MrMojoRisin

同様のエラーが発生しましたが、それはhas_one関係を作成し、その後had_oneのモデルを削除したためです。残りのモデルからhas_one関係を削除するのを忘れました。

0
therealrodk

同じエラーが発生しました。性急な足場で、model.rbファイルを省いたことがわかりました。

0
jared