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

Posted

技术标签:

【中文标题】Rails 5.2.0 中的“无法自动加载常量”错误【英文标题】:"Unable to autoload constant" Bug in Rails 5.2.0 【发布时间】:2021-02-09 09:04:22 【问题描述】:

我正在运行 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

*** 上的一些帖子表明此错误可能是由我的控制器文件中的拼写错误引起的,但事实并非如此。或者,有些人提到了 Rails 的大小写敏感性。但是,如果我尝试在routes.rb 文件或控制器中将apiv1 更改为ApiV1,Rails 将抛出错误。

I saw a comment 建议应该运行rails r 'puts ActiveSupport::Dependencies.autoload_paths',如果我在输出列表中没有看到/fruits_and_vegetables/app/controllers/api,则将config.autoload_paths &lt;&lt; Rails.root.join("app/controllers/api") 添加到我的config/application.rb 文件中,但it seems that is discouraged。

有什么想法吗?我在这里看到至少十几个类似的帖子,但似乎没有真正的具体解决方案?

【问题讨论】:

你试过这样定义你的控制器吗?:module Api; module V1; class ApplesController &lt; ApplicationController; end; end; end.在每个 ; 所在的位置添加一个新行,并将其从代码中删除。 我刚开始升级到 Rails 5.2.0(从 Rails 5.1.6.2)并且遇到同样的问题(当我的应用程序服务器启动时)。我尝试了上面的建议(通过 fanta,即按行显式命名模块/类),导致相同的错误。 【参考方案1】:

当我简单地将 Rails 升级到 5.2.0 版时,我的旧版 Rails 5.1 应用程序代码也发生了同样的 (LoadError) 错误。修复(对我来说)是添加一个丢失的源文件,它只定义一个子模块(以满足自动加载器)。我将在原始帖子示例的上下文中解释修复。

在原始帖子中,ApplesControllerV1 命名空间的一部分。问题是,V1 子模块没有(明确)定义。解决方案是在正确的(自动加载)路径上创建一个文件,该文件定义了 V1 模块:

app/controllers/api/v1.rb

module Api
  module V1
  end
end

显然,从 Rails 5.2 开始,自动加载器需要明确定义每个模块命名空间。你可以阅读关于Rails 5.2 constant autoloading的技术细节。

还有一个related SO answer to the same issue。

【讨论】:

Jeff,v1.rb 文件应该是 api 目录的子目录还是 v1 目录的子目录?那么,api 目录的子目录(和 v1 目录的兄弟)?或者,v1 目录的子目录(以及 apples_controller.rb 文件的兄弟)?再次感谢您的帮助 如上面的答案所示,v1.rb file 位于api directory(与v1 directory 一起)。

以上是关于Rails 5.2.0 中的“无法自动加载常量”错误的主要内容,如果未能解决你的问题,请参考以下文章

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

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

adminLTE 2.4.5树视图在刷新后无法正常工作,只有它在rails中工作

带有 Ruby 2.5.1 控制台的 Rails 5.2.0 - `warning:` `already` 已初始化常量 FileUtils::VERSION

升级到 rails 5.2 - 远程表单现在刷新页面

ruby on rails 中的 Coffeescript 编译错误