Rails关注,如何在api控制器中包含一个问题

时间:2017-10-07 16:23:34

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

我正在构建一个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控制器相关,我想将文件移动到&#39; api/concerns/error_serializer.rb&#39;。

但这会产生错误:

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

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

module Api::ErrorSerialzer

但得到了同样的错误。

那么我必须更改哪些内容才能移动该文件?

2 个答案:

答案 0 :(得分:4)

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

// Gets called from an std::thread or worker thread
void MyClass::ThreadFunctionToCalculateValue() {

    {   // auto unlock after leaving block scope
        std::lock_guard<std::mutex> lock(m_mutex);
        m_calculated_value = ComplexLogicToCalculateValue();
        m_value_ready = true;
    }   // unlock occurs here
    m_my_condition_variable.notify_one();
}

由于您将其包含在module Api::Concerns::ErrorSerializer 中,我会这样做:

Api::TemplatesController

使用常量查找来帮助退出。

答案 1 :(得分:0)

感谢@jvillian和this blog post的回答,我能够弄清楚&#39; Rails&#39;这样做的方式(因为实际上我需要在所有Api控制器中关注,并且我的api控制器也在api命名空间之外)。所以我发布这个解决方案(我认为)它是首选方式:

我将error_serialzier.rb文件移动到api / Concer中并更改代码以包含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

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