Rails 关注点,如何在 api 控制器中包含关注点
Rails concerns, how to include a concern inside an api controller
我正在构建一个 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
但得到了同样的错误。
那么我必须更改什么才能移动该文件?
由于 rails 希望您的模块命名遵循您的文件结构,因此您的问题应命名为:
module Api::Concerns::ErrorSerializer
既然你把它包含在 Api::TemplatesController
中,我会这样做:
class Api::TemplatesController < ApiController
include Api::Concerns::ErrorSerializer
...
end
帮助 rails 进行不断的查找。
感谢@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
这消除了未初始化的常量错误。
我正在构建一个 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
但得到了同样的错误。
那么我必须更改什么才能移动该文件?
由于 rails 希望您的模块命名遵循您的文件结构,因此您的问题应命名为:
module Api::Concerns::ErrorSerializer
既然你把它包含在 Api::TemplatesController
中,我会这样做:
class Api::TemplatesController < ApiController
include Api::Concerns::ErrorSerializer
...
end
帮助 rails 进行不断的查找。
感谢@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
这消除了未初始化的常量错误。