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コンソールはすべてのモデルを自動的にロードするものと考えました。ここで何が起こっていますか?
試すべきこと:
Railsコンソールを再起動します。モデルへの変更は、> reload!
を実行した場合(これは予測不可能であることがわかったが)、またはコンソールを再起動した場合に既に開いているRailsコンソールによってのみ反映されます。
モデルファイルは「phone_number.rb」と呼ばれ、「/ app/models」にありますか?
Railsコンソールコマンドの「--sandbox」オプションを再確認する必要があります。私の知る限り、これは変更を防ぎます。スイッチなしで試してください。
エラーが発生していました:
NameError: uninitialized constant
その後、誤って複数のモデルを作成したことに気付いたので、戻ってモデルファイルの名前を特異に変更し、モデルファイルのクラス名を特異に変更して解決しました。
Rails 5.1から5.2にアップグレードした後にこの問題が発生し始めました
次の方法で解決しました:
spring stop
spring binstub --all
spring start
Rails s
models
ディレクトリに直接ファイルがある状態でもこれに遭遇しましたが、起動時にコードを適切にロードしていないことがわかりました。 development.rbファイルにconfig.eager_load = true
を設定することで問題を修正できました。これにより、コンソールでクラスを利用できるようになりました
@ Michael-Nealと同様です。
コントローラーを単数と名付けました。 app/controllers/product_controller.rb
複数に名前を変更すると、エラーが解決しました。 app/controllers/products_controller.rb
上記のどれもうまくいかない場合、実際のシナリオで私に起こったように、私は別のアプローチも持っています。
より具体的には、自動生成されたRubyファイルを Thrift から使用します。
私の状況では、いくつかのクラスを持つModule
があったため、この場合は順序が重要です:
Class A
は、同じモジュールのClass B
を使用します。ただし、Class B
が宣言されましたafterClass A
。
Class B
を宣言するbeforeClass A
を作成するだけで問題が解決しました。
モデルのクラスの名前を変更し、ファイルの名前と一致しなかったため、この問題が発生しました。
「モデルクラス名はCamelCaseを使用します。これらは単数形であり、複数のデータベーステーブル名に自動的にマッピングされます。
モデルファイルはapp/models /#{singular_model_name} .rbに保存されます。」
https://Gist.github.com/iangreenleaf/b206d09c587e8fc6399e#model
同様のエラーが発生しましたが、それはhas_one
関係を作成し、その後had_one
のモデルを削除したためです。残りのモデルからhas_one
関係を削除するのを忘れました。
同じエラーが発生しました。性急な足場で、model.rbファイルを省いたことがわかりました。