我正在构建一个Rails api,目前有这个文件夹结构:
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
但得到了同样的错误。
那么我必须更改哪些内容才能移动该文件?
答案 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
这消除了未初始化的常数错误。