我知道已经有一些问题,也有关于AMS没有有效处理命名空间的这是一个开放性问题(该版本控制方法使用了它),但我想确保在当前约束条件下我走在正确的轨道上。
现在我正在使用Rails 5和AMS 0.10.1,所以我做了以下操作:
禁用默认序列化程序查找(无论如何都不起作用); 和
现在我正在使用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版本并在示例未设置时引发错误。
所以:
- 有更好的文档记录方法吗?
- 这是否正确?
- 我将来会遇到问题吗?
- 如何改进?
get_serializer
总是由AMS调用,如果它不遵循定义的约定,我只需要使用render json:@object,serializer:Namespaced :: Unconventional :: ObjectSerializer
即可。 - chrisandrew.cl