NameError:未初始化的常量(rails)

时间:2014-10-15 22:51:08

标签: ruby-on-rails-4 rails-console

我有一个名为PhoneNumber的简单模型:

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

我转到应用程序的根文件夹(包含app子文件夹的文件夹)并启动控制台:

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

控制台似乎并不知道该型号。在普通的红宝石中,你需要要求&#39;包含该类的文件,但我认为rails控制台将自动加载所有模型。这是怎么回事?

12 个答案:

答案 0 :(得分:45)

有些事情要尝试:

  1. 重启rails控制台;如果您执行> reload!(虽然我发现这是不可预测的),或者通过重新启动控制台,只有已经打开的rails控制台才能获取模型的更改。

  2. 您的模型文件名为&#34; phone_number.rb&#34;它是在&#34; / app / models&#34;?

  3. 你应该仔细检查&#34; - 沙箱&#34; rails console命令上的选项。 AFAIK,这可以防止变化。不用开关就试试。

答案 1 :(得分:23)

我收到了错误:

NameError: uninitialized constant

然后我注意到我不小心创建了一个复数模型,所以我回去并将模型文件重命名为单数,并将模型文件中的类名更改为单数并解决了它。

答案 2 :(得分:5)

我也直接在models目录中遇到了一个文件,结果发现我在启动时没有正确加载代码。我能够通过在development.rb文件中设置config.eager_load = true来解决问题。这使我可以在控制台中使用该课程

答案 3 :(得分:4)

从Rails 5.1升级到5.2后,我开始遇到此问题 它解决了:

spring stop
spring binstub --all
spring start
rails s

答案 4 :(得分:1)

如果上述工作都没有,我也有不同的方法,因为它发生在真实场景中。

更具体地说,使用来自Thrift的自动生成的Ruby文件。

在我的情况下,我有一个Module有几个班级,因此在这种情况下的顺序非常重要:

Class A在同一模块中使用Class B。但是,Class BClass A之后被声明为

只需在 Class B之前将Class A声明为,就可以解决问题。

答案 5 :(得分:1)

与@ Michael-Neal相似。

我将控制器命名为单数。应用程序/控制器/的 product_controller.rb

当我将其重命名为复数时,错误已解决。应用程序/控制器/的 products_controller.rb

答案 6 :(得分:0)

我有同样的错误。在我仓促的脚手架中,我遗漏了model.rb文件。

答案 7 :(得分:0)

我遇到了类似的错误,但这是因为我创建了has_one关系并随后删除了它had_one的模型。我忘了从剩下的模型中删除has_one关系。

答案 8 :(得分:0)

我遇到了这个问题,因为我在模型中更改了类的名称,但它与文件名不匹配。

“模型类名称使用CamelCase。它们是单数形式,并且将自动映射到复数数据库表名称。

模型文件进入app / models /#{singular_model_name} .rb。”

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

答案 9 :(得分:0)

就我而言,我为列名命名为type,并尝试将其值设置为UNPREPARED。我收到这样的错误消息:

原因: api_1 | NameError:未初始化的常量UNPREPARED

在导轨中,列type被保留:

ActiveRecord :: SubclassNotFound:单表继承机制无法找到子类“ UNPREPARED”。出现此错误是因为在继承的情况下,列“类型”保留用于存储类。 l 如果您不希望将其用于存储继承类,则可以轻松地重命名该列,或者覆盖Food.inheritance_column以将另一列用于该信息

答案 10 :(得分:0)

我在 Ubuntu 20.04 中处理 Rails 6 应用程序时遇到了同样的问题。

当我使用命令启动 rails 控制台时

rails console

然后运行下面的命令来列出所有可用的角色

Role.all

我收到以下错误:

Traceback (most recent call last):
        1: from (irb):2
NameError (uninitialized constant Role)

这是我修复它的方法

问题是我的 Role 模型使用名为 Userbase 的模块命名。所以,而不是这样:

Role.all

应该是这样的:

Userbase::Role.all

就这些

我希望这会有所帮助

答案 11 :(得分:0)

通过确保文件名与具有正确约定的类名相同,我的问题也得到了解决,例如 class AdLikes 具有文件名 ad_likes.rb