Rails:NameError:未初始化的常量

Posted

技术标签:

【中文标题】Rails:NameError:未初始化的常量【英文标题】:Rails: NameError: uninitialized constant 【发布时间】:2014-12-11 04:09:37 【问题描述】:

我有一个名为 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

当我尝试创建一个空的电话号码时(我想收到一条错误消息,因为验证将失败)我收到以下错误消息:

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 控制台应自动加载所有模型。这是怎么回事?

【问题讨论】:

为了解决我的问题,我只需要将迁移文件名称中的模型名称复数,例如20180612create_users.rb 【参考方案1】:

一些尝试:

    重启 rails 控制台;如果您执行&gt; reload!(尽管我发现这是不可预测的),或者通过重新启动控制台,对模型的更改只会被已经打开的 Rails 控制台接收。

    您的模型文件是否名为“phone_number.rb”,是否在“/app/models”中?

    您应该仔细检查您的 rails 控制台命令中的“--sandbox”选项。 AFAIK,这可以防止更改。不带开关试试看。

【讨论】:

这似乎是文件的名称 - 它是 app/models/PhoneNumber.rb。当我将其更改为 app/models/phone_number.rb 时,错误消息消失了。 reload! 为我工作!似乎模型初始化的某些部分被缓存了,所以如果该部分有错误,当您第二次运行控制台时,它可能会变成“不可见”错误。 在我的例子中,模型是以复数命名的,我只需要改变它。谢谢【参考方案2】:

我收到了错误:

NameError: uninitialized constant

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

【讨论】:

【参考方案3】:

我有同样的错误。结果在我匆忙的脚手架上我遗漏了 model.rb 文件。

【讨论】:

【参考方案4】:

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

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


在我的情况下,我有一个 Module 有几个类,所以在这种情况下顺序 很重要:

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

只需将Class B 声明为之前 Class A 解决了我的问题。

【讨论】:

【参考方案5】:

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

【讨论】:

这里有更多关于这个解决方案的信息:collectiveidea.com/blog/archives/2016/07/22/…tldr; “在 Rails 5 中,如果 config.eager_load = true,自动加载现在完全禁用。”【参考方案6】:

与@Michael-Neal 类似。

我将控制器命名为单数。 app/controllers/product_controller.rb

当我将它重命名为复数时,错误解决了。 app/controllers/products_controller.rb

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我在将 Rails 5.1 升级到 5.2 后开始遇到这个问题 我解决了:

spring stop
spring binstub --all
spring start
rails s

【讨论】:

谢谢!浪费了几个小时。【参考方案9】:

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

“模型类名称使用 CamelCase。这些是单数的,会自动映射到复数的数据库表名。

模型文件放在 app/models/#singular_model_name.rb 中。”

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

【讨论】:

【参考方案10】:

在我的例子中,我将列名命名为 type 并尝试将其值设置为 UNPREPARED。我收到这样的错误消息:

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

在 rails 中,type 列是保留的:

ActiveRecord::SubclassNotFound:单表继承机制未能找到子类:'UNPREPARED'。引发此错误是因为“类型”列保留用于在继承的情况下存储类。 PL 如果您不打算将该列用于存储继承类或覆盖 Food.inheritance_column 以使用另一列存储该信息,请轻松重命名此列

【讨论】:

【参考方案11】:

我在 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

就是这样

我希望这会有所帮助

【讨论】:

【参考方案12】:

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

【讨论】:

是的,这很重要。

以上是关于Rails:NameError:未初始化的常量的主要内容,如果未能解决你的问题,请参考以下文章

Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”

运行规范命令时未初始化的常量 Spec::Rails (NameError)

Capybara 2.1 错误未初始化常量 Rails (NameError)

Rails 3 rc 上的 Macvim 和 rails.vim - 未初始化的常量 Bundler (NameError)

Rails webrick 强制退出:未初始化的常量 WebConsole::Railtie::Middleware (NameError)

未初始化的常量 Gibbon::Request (NameError)