[英]Rails concerns, how to include a concern inside an api controller
我正在构建Rails api,当前具有以下文件夹结构:
error_serializer.rb文件是一个模块:
module ErrorSerializer
extend ActiveSupport::Concern
...methods here...
end
我可以将其包含在任何api控制器中,例如:
class Api::TemplatesController < ApiController
include ErrorSerializer
...
end
但是,由于这个errors_serializer模块仅与api控制器相关,因此我想将文件移至“ api/concerns/error_serializer.rb
”。
但这会产生错误:
ActionController::RoutingError (uninitialized constant Api::TemplatesController::ErrorSerializer)
我尝试将文件内的名称更改为:
module Api::ErrorSerialzer
但是出现了同样的错误。
那么我必须更改什么才能移动该文件?
由于Rails希望模块命名遵循文件结构,因此应将您的关注点命名为:
module Api::Concerns::ErrorSerializer
由于您将其包含在Api::TemplatesController
,因此我将这样做:
class Api::TemplatesController < ApiController
include Api::Concerns::ErrorSerializer
...
end
为了帮助不断查找。
感谢@jvillian和这篇博客文章的回答,我能够弄清楚做到这一点的“ Rails”方法(因为实际上我将需要所有Api控制器的关注,而且我的api控制器不在api名称空间之外) 。 因此,我发布此解决方案是因为(我认为)这是首选方式:
我将error_serialzier.rb文件移到api / concerns中,并更改了代码以包含Api名称空间:
module Api::Concerns::ErrorSerializer
extend ActiveSupport::Concern
...
end
我还移动了api_controller.rb
文件,并将其放在/ api文件夹中,从而放入API模块名称空间,所以现在看起来像这样:
class Api::ApiController < ActionController::API
before_action :authenticate_api_user!
include DeviseTokenAuth::Concerns::SetUserByToken
include Concerns::ErrorSerializer
respond_to :json
end
这消除了未初始化的常量错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.