Ruby on rails &引用;无法自动加载常量“;Rails 5.2.0中的Bug
我正在运行Rails 5.2.0应用程序。此Ruby on rails &引用;无法自动加载常量“;Rails 5.2.0中的Bug,ruby-on-rails,api,controller,autoload,Ruby On Rails,Api,Controller,Autoload,我正在运行Rails 5.2.0应用程序。此LoadError总是在重新启动或重新编译后的第一次请求时出现: 无法自动加载常量Api::V1::ApplesController,应为/fruits\u and\u vegets/app/controllers/Api/V1/apples\u controller.rb来定义它 相关文件: routes.rb Rails.application.routes.draw do namespace :api do namespace :v1
LoadError
总是在重新启动或重新编译后的第一次请求时出现:
无法自动加载常量Api::V1::ApplesController,应为/fruits\u and\u vegets/app/controllers/Api/V1/apples\u controller.rb来定义它
相关文件:
routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
get 'apples', to: 'apples#get'
end
end
end
module Api
module V1
end
end
以下是文件结构:
- app
- controllers
- api
- v1
- apples_controller.rb
苹果控制器.rb中有什么
class Api::V1::ApplesController < ApplicationController
// stuff
end
class Api::V1::ApplesController
StackOverflow上的一些帖子表明,这个错误可能是由我的控制器文件中的输入错误引起的,但事实并非如此。或者,一些人提到了Rails的案例敏感性。但是,如果我试图在routes.rb
文件或控制器中将api
和v1
更改为api
或v1
,Rails将抛出错误
建议运行rails r'puts ActiveSupport::Dependencies.autoload_path'
,如果我在输出列表中没有看到/fruits_and_vegets/app/controllers/api
,那么添加config.autoload_path我的旧版rails 5.1应用程序代码也会出现同样的(LoadError)错误,当我将Rails升级到5.2.0版时。修复(对我来说)是添加一个丢失的源文件,该文件仅定义一个子模块(以满足自动加载程序的要求)。我将在原始post示例的上下文中解释修复
在最初的帖子中,ApplesController
是V1
命名空间的一部分。问题是,V1
子模块没有(明确)定义。解决方案是在正确的(自动加载)路径上创建一个文件,该文件定义V1
模块:
app/controllers/api/v1.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
get 'apples', to: 'apples#get'
end
end
end
module Api
module V1
end
end
显然,从Rails5.2开始,自动加载程序需要显式定义每个模块名称空间。您可以阅读有关的技术详细信息
还有一个。您是否尝试过这样定义控制器?:模块Api;模块V1;类ApplesController
。添加新行,其中每个代码>是,并将其从代码中删除。我刚刚开始升级到Rails 5.2.0(从Rails 5.1.6.2),并且有相同的问题(当我的应用程序服务器启动时)。我尝试了上面的建议(由fanta提出,即通过行显式地命名模块/类),这导致了相同的错误。Jeff,v1.rb文件应该是api目录的子目录还是v1目录的子目录?那么,是api目录的子目录(还是v1目录的同级目录)?或者,v1目录的子目录(以及apples_controller.rb文件的同级目录)?再次感谢您的帮助正如上面的答案所示,v1.rb文件
位于api目录
(以及v1目录
)。