Rails 控制台:无法自动加载常量

Posted

技术标签:

【中文标题】Rails 控制台:无法自动加载常量【英文标题】:Rails console: Unable to autoload constant 【发布时间】:2014-05-11 12:21:25 【问题描述】:

我有一个 Customer_ratings 模型,允许用户互相留下反馈。 Web 应用程序运行正常,并收集、存储和显示反馈。

本想进去通过rails控制台删除一些反馈,但是当我输入Customer_rating.all时,出现如下错误:

LoadError: Unable to autoload constant Customer_rating, expected /Users/myapps/app/models/customer_rating.rb to define it

同样,如果我输入 Customer_rating[0],我会得到:

RuntimeError: Circular dependency detected while autoloading constant Customer_rating

我在通过控制台访问其他表时没有这个问题。

什么可能导致问题,为什么这个错误不会阻止 Customer_ratings 通过网络应用程序正常工作?

【问题讨论】:

我在这里看到了几个问题。让我们在聊天chat.***.com/rooms/48530/ror 上讨论这个问题 仅供参考,所有常量都必须是CamelCase——你应该调用CustomerRating 【参考方案1】:

这似乎是一个混乱的命名约定。

根据Rails 命名约定,文件名 应该在snake_case 中,类名 应该在CamelCase 中。在您的方案中,文件名应为customer_rating.rb,类名应为CustomerRating

进行这些更改后,使用CustomerRating.all(因为更新后的类名是CustomerRating)来获取所有客户评级。 不要使用Customer_rating.all

【讨论】:

CustomerRating.all vs Cutomer_rating.all 是问题所在。谢谢! 我在不同情况下收到了类似的错误消息。我的错误是,我在类名中输入了错字,并且 rails 无法在文件中找到预期的类。现已修复。【参考方案2】:

我还想添加一个我发现的这个问题的场景以供将来参考。

我正在运行 Rails 4.0 并且遇到了同样的问题,但发生的情况是我在 student.rb 中有一个名为 Student 的模型,该模型包含在一个名为 Student 的文件夹中。起初我没有意识到,但文件夹名称是问题所在。将文件夹名称更改为模型名称以外的名称即可解决问题。

【讨论】:

谢谢你,好心的先生!【参考方案3】:

如果命名约定没有关闭,就像在这个问题中一样,如果您同时发出大量请求,则在初始首次加载时可能会出现问题。我在嵌套控制器 Api::LocationsController 中遇到过这种情况。

我通过在开发环境中启用 eager_load 解决了这个问题:

Rails.application.configure do
  ...
  # Enabled this to avoid crash unable to autoload controller 
  # Error happens when you start and stop server on initial requests
  # solution found via https://github.com/rails/rails/issues/32082#issuecomment-367715194
  config.eager_load = true

我基于这个脱离轨道的问题 cmets:https://github.com/rails/rails/issues/32082#issuecomment-367715194

【讨论】:

【参考方案4】:

你只需要修改Module的名字

例如,如果链接是http://sairam.esy.es/users/customer_rating,那么 你的控制器应该是

module Users
  class RatingController
    # ...

    def customer_rating
      # ...
    end

    # ...
  end
end

【讨论】:

这不是 Ruby 语法

以上是关于Rails 控制台:无法自动加载常量的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5.2.0 中的“无法自动加载常量”错误

自动加载常量时检测到循环依赖(Rails 4、Ruby 2)

Websocket 控制器未在 Rails 开发环境中自动加载

获取“无法自动加载常量”..“预期 app/lib/subfolder/module.rb 来定义它”

在开发环境中LoadError(无法自动加载常量XYZ,预期XYZ.rb来定义它)

Rails 项目中不断自动加载的问题(偶尔工作)