Korrekte Implementierung der API-Versionierung mit active_model_serializers

Ich weiß, es gibt bereits einige Fragen und auchdies ist ein offenes Thema in Bezug auf AMS, das Namespaces nicht zu effizient behandelt (das von diesem Versionsansatz verwendet wird), aber ich wollte sichergehen, dass ich mich innerhalb der aktuellen Einschränkungen auf dem richtigen Weg befinde.

Im Moment benutze ich Rails 5 und AMS 0.10.1, also habe ich Folgendes getan:

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

, um die standardmäßige Suche nach dem Serializer zu deaktivieren (was ohnehin nicht funktioniert hat); un

# 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

, um zu überschreiben, wie Serialisierer standardmäßig gefunden werden. Meine Controller und Serializer sind wie folgt:

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

un

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

Now, Dinge wieActiveModel::Serializer.serializer_for(object) wird nicht funktionieren, also musste ich auch meine Anforderungsspezifikationen mit @ patchexample.metadata[:api_version], um die API-Version vor jedem Test sowie vor jedem Auslösen und Fehler festzulegen, wenn das Beispiel dies nicht getan hat.

So

Gibt es einen besseren Weg, dies zu dokumentieren?Ist das nah dran, richtig zu sein?Wird ich bei diesem Ansatz mit Problemen konfrontiert?Wie kann es verbessert werden?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage