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 4、Ruby 2)
Websocket 控制器未在 Rails 开发环境中自动加载
获取“无法自动加载常量”..“预期 app/lib/subfolder/module.rb 来定义它”