[英]autoloading in production
我将所有控制器声明为
class Api::V1::SomeController < Api::V1::ApiController; (...); end
哪里
class Api::V1::ApiController < ApplicationController; end
我所有的控制器都放在/app/controllers/api/v1/*_controller.rb
, ApplicationController
在app/controllers/application_controller.rb
。
在开发中,一切正常,但是我在生产中需要并加载包装在api版本控制名称空间中的控制器时遇到问题。
在生产环境(本地或heroku)中,我得到了: LoadError (Unable to autoload constant Api::V1::SomeController, expected /app/app/controllers/api/v1/some_controller.rb to define it):
在生产环境上配置app/config/environments/production.rb
并要求版本控制api的正确方法是什么?
我很确定您可以通过采用模块化方法定义所有命名空间类来解决此问题。 例如:
module Api
module V1
class SomeController < ApiController
# ...
end
end
end
和:
module Api
module V1
class ApiController < ::ApplicationController
# ...
end
end
end
使用此模式可以消除在Rails中自动加载的名称空间的歧义。 自动加载是一个相当复杂的机制......(而且似乎对开发和生产!之间的行为不同),如果您想了解更多的内部运作的这篇文章很值得读。
更新
该::
在::ApplicationController
的意思是“没有命名空间”或“默认命名空间”。 在这种情况下,可能不需要该部分,因为您可能只定义了一个ApplicationController
常量。
可以说,这种方法带来的区别在于,它确保Rails不会“跳过”您的常量定义。 我上面链接的文章通过示例对其进行了解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.