Правильный способ реализации контроля версий API с помощью active_model_serializers

Я знаю, что уже есть некоторые вопросы, а такжеэто открытая проблема, связанная с тем, что AMS не обрабатывает пространства имен слишком эффективно (который используется этим подходом к управлению версиями), но я хотел быть уверенным, что нахожусь на правильном пути в рамках текущих ограничений.

Сейчас я использую 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 перед каждым тестом и поднятием и ошибкой, если пример не установил ее.

Так:

Есть ли лучший способ документирования?Это близко к тому, чтобы быть правильным?Буду ли я сталкиваться с проблемой в дальнейшем с этим подходом?как это может быть улучшено?

Ответы на вопрос(2)

Ваш ответ на вопрос