相关疑难解决方法(0)

使用active_model_serializers实现API版本控制的正确方法

我知道已经存在一些问题,而且这是一个关于AMS没有太高效地处理命名空间的问题(这种版本控制方法使用了这个问题),但我想确保我在当前的限制范围内处于正确的轨道.

现在我正在使用Rails 5和AMS 0.10.1,所以我做了以下事情:

# config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.serializer_lookup_enabled = false
Run Code Online (Sandbox Code Playgroud)

禁用默认的序列化程序查找(无论如何都不起作用); 和

# 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
Run Code Online (Sandbox Code Playgroud)

覆盖默认情况下如何找到序列化程序; 我的控制器和序列化器是这样的:

# 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
    ...
Run Code Online (Sandbox Code Playgroud)

# app/serializers/api/v2/user_serializer.rb
module Api::V2
  class UserSerializer < ActiveModel::Serializer
    ...    
Run Code Online (Sandbox Code Playgroud)

现在,类似的东西ActiveModel::Serializer.serializer_for(object) …

api ruby-on-rails rails-api active-model-serializers ruby-on-rails-5

5
推荐指数
2
解决办法
1510
查看次数