繁体   English   中英

Rails:NameError:未初始化的常量

[英]Rails: NameError: uninitialized constant

我有一个名为 PhoneNumber 的简单 model:

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

我 go 到应用程序的根文件夹(包含 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

控制台似乎不知道 model。在普通的 ruby 中,您需要“要求”包含 class 的文件,但我认为 Rails 控制台应自动加载所有模型。 这里发生了什么?

一些尝试:

  1. 重启 rails 控制台; 如果您这样做> reload! ,则模型的更改只会被已经打开的rails控制台接收> reload! (虽然我发现这是不可预测的),或者通过重新启动控制台。

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

  3. 您应该仔细检查 rails 控制台命令中的“--sandbox”选项。 AFAIK,这会阻止更改。 不用开关试试。

我收到错误:

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 类似。

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

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

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

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


在我的情况下,我有一个包含多个类的Module ,因此在这种情况下顺序重要:

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

只需Class A向我解决问题之前声明Class B Class A即可。

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

"模型类名使用驼峰式命名。这些是单数,会自动映射到复数的数据库表名。

模型文件位于 app/models/#{singular_model_name}.rb 中。”

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

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

我有同样的错误。 事实证明,在我草率的搭建过程中,我遗漏了 model.rb 文件。

我有一个类似的错误,但是那是因为我创造了一个has_one关系,后来被删除,它的模型had_one的。 我只是忘了从剩余的模型中删除has_one关系。

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

引起:api_1 | NameError: 未初始化的常量 UNPREPARED

在 rails 中,保留了列type

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

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

就这样

我希望这有帮助

嗨,我遇到了同样的问题,我只是通过在/config/routes.rb上指定控制器来解决它,找到放置控制器名称的路由。

示例:我有控制器product_controller.rb

路线.rb

resource :product, controller: 'product', only: [:edit, :update]

我得到了同样的错误。 这些类存在命名约定问题。 我的文件名为checkitemgroup_query.rb但我将 class 初始化为CheckitemGroupQuery 通过将 class 名称替换为CheckitemgroupQuery ,我的问题得到解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM