【发布时间】:2016-10-26 07:53:42
【问题描述】:
我知道已经有一些问题和this is a open issue regarding AMS not handling namespaces too efficiently(此版本控制方法使用),但我想确保我在当前限制内处于正确的轨道。
现在我使用的是 Rails 5 和 AMS 0.10.1,所以我做了以下操作:
# config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.serializer_lookup_enabled = false
禁用默认的序列化程序查找(无论如何都不起作用);和
# app/controllers/application_controller.rb
class ApplicationController < ActionController::API
def get_serializer(resource, options = {})
unless options[:each_serializer] || options[:serializer] then
serializer = (self.class.name.gsub("Controller","").singularize + "Serializer").constantize
resource.respond_to?(:to_ary) ? options[:each_serializer] = serializer : options[:serializer] = serializer
end
super(resource, options)
end
end
覆盖默认情况下如何找到序列化程序;我的控制器和序列化器是这样的:
# app/controllers/api/v2/api_controller.rb
module Api::V2
class ApiController < ApplicationController
...
# app/controllers/api/v2/users_controller.rb
module Api::V2
class UsersController < ApiController
...
和
# app/serializers/api/v2/user_serializer.rb
module Api::V2
class UserSerializer < ActiveModel::Serializer
...
现在,ActiveModel::Serializer.serializer_for(object) 之类的东西将不起作用,因此我还必须使用 example.metadata[:api_version] 猴子修补我的请求规范,以便在每次测试之前设置 API 版本,如果示例未设置,则会引发错误。
所以:
- 有没有更好的记录方法?
- 这是否接近正确?
- 使用这种方法我会面临进一步的问题吗?
- 如何改进?
【问题讨论】:
标签: ruby-on-rails api ruby-on-rails-5 active-model-serializers rails-api