Maneira correta de implementar o versionamento da API com active_model_serializers

Eu sei que já existem algumas perguntas e tambémesse é um problema em aberto no que diz respeito ao AMS não manipular espaços de nome com muita eficiência (que é usado por essa abordagem de controle de versão), mas eu queria ter certeza de que estou no caminho certo, dentro das restrições atuais.

No momento, estou usando o Rails 5 e o AMS 0.10.1, então fiz o seguinte:

# config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.serializer_lookup_enabled = false

desativar a pesquisa padrão do serializador (que não funcionou de qualquer maneira); e

# 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

substituir como os serializadores são encontrados por padrão; meus controladores e serializador são assim:

# 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
    ...

e

# app/serializers/api/v2/user_serializer.rb
module Api::V2
  class UserSerializer < ActiveModel::Serializer
    ...    

Agora, coisas comoActiveModel::Serializer.serializer_for(object) não funcionou, então eu também precisei aplicar um patch em minhas especificações de solicitação usandoexample.metadata[:api_version] para definir a versão da API antes de cada teste e gerar e erro se o exemplo não a definiu.

Assim:

Existe uma maneira melhor documentada?Isso está perto de estar correto?Estarei enfrentando problemas ainda mais com essa abordagem?Como pode ser melhorado?

questionAnswers(2)

yourAnswerToTheQuestion