【问题标题】:Rails: NameError: uninitialized constantRails:NameError:未初始化的常量
【发布时间】: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

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


【解决方案1】:

一些尝试:

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

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

  3. 您应该仔细检查您的 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 来解决这个问题。这使我可以在控制台中使用该课程

        【讨论】:

        【解决方案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

                  【讨论】:

                  • 是的,这很重要。
                  猜你喜欢
                  • 2020-06-26
                  • 1970-01-01
                  • 2015-10-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-02-25
                  • 2016-11-24
                  • 2013-08-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多