2017-10-07 94 views
0

我建立一个Rails的API,目前有这样的文件夹结构内的关注:Rails的关注,如何包括API控制器

enter image description here

的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 

,但得到了同样的错误。

那么,我必须改变以便能够移动该文件?

+0

您是否将'include'更改为'Api :: ErrorSerializer'? –

+0

@AndrewMarshall是的,我做到了。 – rmcsharry

回答

3

由于轨道预期的模块命名跟随你的文件结构,你的关心应该命名为:

module Api::Concerns::ErrorSerializer 

既然你把它放置Api::TemplatesController,我会做:

class Api::TemplatesController < ApiController 
    include Api::Concerns::ErrorSerializer 
    ... 
end 

要通过不断的查找帮助您找到问题。

0

感谢来自@jvillian和this blog post的回答,我能够找到'Rails'的方式来做到这一点(因为实际上我需要所有Api控制器的关注,并且我的api控制器也超出了api命名空间)。所以我张贴这种解决方案,(我认为)这是首选的方法:

我感动error_serialzier.rb文件转换成API /关注并更改代码,包括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 

这摆脱了未初始化的常量错误。