1

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

但得到了同样的错误。

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

4

2 回答 2

6

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

module Api::Concerns::ErrorSerializer

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

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

通过不断的查找来帮助解决问题。

于 2017-10-07T16:29:16.793 回答
0

感谢@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

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

于 2017-10-07T17:05:20.300 回答