Rails: 名称错误:未初始化的常量

59

我有一个叫做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

当我尝试创建一个空的电话号码(我希望由于验证失败而收到错误消息)时,我会收到以下错误消息:

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 中,您需要“require”包含类的文件,但我认为 Rails 控制台应该自动加载所有模型。这里出了什么问题?


1
为了修复这个问题,我只需要在迁移文件名中将模型名称变成复数形式,例如:20180612create_users.rb - fungusanthrax
17个回答

0

我曾经遇到过同样的错误。后来发现在我的快速搭建中,我漏掉了model.rb文件。


0

我曾经遇到过类似的错误,但是那是因为我创建了一个has_one关系,然后又删除了它所属的模型。我只是忘记从剩余的模型中删除has_one关系。


0

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

例如:我有一个控制器product_controller.rb

routes.rb

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

0

让我分享一下我的经验,希望对某些人有用。

简而言之,应用程序数据库没有在关系型数据库管理系统中创建。

突然间,当我尝试运行app/models下的一个类的任何测试时,我开始遇到这个问题。它已经很久没有改变了,但我仔细检查了它是否符合正确的文件/类名约定,但没有效果。

由于回溯指向了急切加载,我查看了@lostphilosopher在上面的评论中提供的优秀link。所以我尝试先禁用急切加载。

运行失败,并出现找不到数据库的错误。在创建了数据库之后,急切和非急切加载都开始工作了。我不知道为什么在急切模式下错误如此误导人。但现在没有时间深入研究这个问题。

只是想让某些人发现这个有用。


0
在我的情况下,我给一列命名为type,并试图将其值设置为UNPREPARED。然后,我得到了这样的一个错误信息:

由此引起: api_1 | NameError: uninitialized constant UNPREPARED

在Rails中,列type是被保留的:

ActiveRecord::SubclassNotFound:单表继承机制无法定位子类:“UNPREPARED”。出现此错误是因为列“type”保留用于存储类别以进行继承。如果您不打算将其用于存储继承类别,请重命名此列,或覆盖Food.inheritance_column以使用其他列来存储该信息


0

我遇到了同样的错误。类的命名规范有问题。我的文件名是checkitemgroup_query.rb,但我在初始化类时使用的是CheckitemGroupQuery。通过将类名替换为CheckitemgroupQuery,我的问题得到了解决。


0
对我来说,这一切始于升级到Rails 7。
原来,如果应用程序在初始化过程中自动加载了可重新加载的内容,就可能出现此错误。
我找到了这个StackOverflow回答,它提到了这个指南 - 根据那篇指南:

在 to_prepare 块之外的初始化过程中自动加载可重新加载的常量的应用程序在 Rails 6.0 以后会卸载这些常量并发出此警告:
/ 警告信息 /
如果您仍然在日志中看到这个警告,请查阅关于应用程序启动时的自动加载部分的自动加载指南。否则,在Rails 7中会引发 NameError。

我在应用程序的初始化阶段自动加载了可重新加载的内容。在将其包装后,问题解决了。
Rails.application.config.to_prepare do 和 end 像 在自动加载指南中建议的那样,问题得到了解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接