【问题标题】:Rails concerns, how to include a concern inside an api controllerRails 关注点,如何在 api 控制器中包含关注点
【发布时间】:2017-10-07 16:23:33
【问题描述】:

我正在构建一个 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

但遇到了同样的错误。

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

【问题讨论】:

  • 您是否将include 更改为Api::ErrorSerializer
  • @AndrewMarshall 是的,我做到了。

标签: ruby-on-rails rails-api activesupport-concern


【解决方案1】:

由于 rails 期望您的模块命名遵循您的文件结构,因此您的关注点应命名为:

module Api::Concerns::ErrorSerializer

既然您将它包含在 Api::TemplatesController 中,我会这样做:

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

帮助解决持续查找问题。

【讨论】:

    【解决方案2】:

    感谢@jvillian 和this blog post 的回答,我能够找出“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
    

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

    【讨论】:

    • 如果error_serializer.rb文件不在/api/concerns中,但仍在/concerns中,你知道如何包含error_serializer.rb吗?
    • @ToshihiroYokota 我不再在 Rails 中工作了,但是试试include Concerns::ErrorSerializer
    • @rmcharry 它刚刚工作。我知道如果我认识到“rails 期望您的模块命名遵循您的文件结构”,它会起作用。谢谢你。
    • @ToshihiroYokota 很高兴听到它有效,感谢您告诉我! :)
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多