ruby-on-rails - Rails 5.2.0 中的“无法自动加载常量”错误
问题描述
我正在运行 Rails 5.2.0 应用程序。这LoadError
总是出现在重新启动或重新编译后的第一个请求中:
Unable to autoload constant Api::V1::ApplesController, expected /fruits_and_vegetables/app/controllers/api/v1/apples_controller.rb to define it
相关文件:
routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
get 'apples', to: 'apples#get'
end
end
end
这是文件结构:
- app
- controllers
- api
- v1
- apples_controller.rb
里面有什么apples_controller.rb
:
class Api::V1::ApplesController < ApplicationController
// stuff
end
StackOverflow 上的一些帖子表明此错误可能是由我的控制器文件中的拼写错误引起的,但事实并非如此。或者,有些人提到了 Rails 的大小写敏感性。但是,如果我尝试在文件或控制器中更改api
和v1
到Api
或,Rails 将抛出错误。V1
routes.rb
我看到一条评论建议应该运行rails r 'puts ActiveSupport::Dependencies.autoload_paths'
,如果我在输出列表中没有看到/fruits_and_vegetables/app/controllers/api
,则添加config.autoload_paths << Rails.root.join("app/controllers/api")
到我的config/application.rb
文件中,但似乎不鼓励这样做。
有什么想法吗?我在这里看到至少十几个类似的帖子,但似乎没有真正的具体解决方案?
解决方案
当我将 Rails 升级到 5.2.0 版时,我的旧版 Rails 5.1 应用程序代码也发生了同样的(LoadError)错误。修复(对我来说)是添加一个丢失的源文件,它只定义一个子模块(以满足自动加载器)。我将在原始帖子示例的上下文中解释修复。
在原始帖子中,ApplesController
是V1
命名空间的一部分。问题是,V1
子模块没有(明确)定义。解决方案是在正确的(自动加载)路径上创建一个定义V1
模块的文件:
app/controllers/api/v1.rb
module Api
module V1
end
end
显然,从 Rails 5.2 开始,自动加载器需要显式定义每个模块命名空间。您可以阅读有关Rails 5.2 常量自动加载的技术细节。
以及对同一问题的相关 SO 答案。
推荐阅读
- twilio - 不欺骗电话
- python - Python Falcon 和 Axios:无法允许 CORS
- r - R for 循环结果
- excel - 如何从 Excel 值更改日期和时间格式?
- winapi - winapi - AppendMenu - 文本布局
- sql-server - 使用 max(date) 返回单个日期
- javascript - chrome 不支持 ShowModelDialog
- jenkins - 仅归档 katalon jenkins 作业中的最新 .png 文件
- matlab - 如何在地块上使用刺作为刻度?
- python - 传递给我的自定义模块时 var 类型的 Ansible 错误