代码之家  ›  专栏  ›  技术社区  ›  rmcsharry

Rails关注点,如何在api控制器中包含关注点

  •  2
  • rmcsharry  · 技术社区  · 7 年前

    我正在构建Rails api,目前有以下文件夹结构:

    enter image description here

    error\u序列化程序。rb文件是一个模块:

    module ErrorSerializer
      extend ActiveSupport::Concern
    
      ...methods here...
    end
    

    我可以将其包含在任何api控制器中,例如:

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

    但由于这个errors\u序列化程序模块只与api控制器相关,因此我想将文件移动到' api/concerns/error_serializer.rb '.

    但这会产生错误:

    ActionController::RoutingError (uninitialized constant Api::TemplatesController::ErrorSerializer)
    

    我尝试将文件中的名称更改为:

    module Api::ErrorSerialzer
    

    但也犯了同样的错误。

    那么,我必须改变什么才能移动该文件?

    2 回复  |  直到 7 年前
        1
  •  7
  •   jvillian    7 年前

    由于rails希望您的模块命名遵循您的文件结构,因此您的问题应该命名为:

    module Api::Concerns::ErrorSerializer
    

    既然你把它包括在 Api::TemplatesController

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

    帮助rails不断查找。

        2
  •  0
  •   rmcsharry    7 年前

    感谢@jvillian和 this blog post ,我能够找到“Rails”实现这一点的方法(因为实际上我需要所有Api控制器中的关注点,而且我的Api控制器在Api命名空间之外)。因此,我发布这个解决方案,因为(我认为)它是首选方式:

    我移动了error\u 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
    

    这消除了未初始化的常量错误。