Ich weiß, es gibt bereits einige Fragen und auch this is a open issue regarding AMS not handling namespaces too efficiently (die von dieser Versionierung Ansatz verwendet wird), aber ich wollte sicher sein, dass ich innerhalb der aktuellen Einschränkungen in der richtigen Spur bin.Richtiger Weg zur Implementierung von API Versioning mit Active_Model_serializers
Im Moment bin ich mit Rails 5 und AMS 0.10.1, so habe ich die folgenden:
# config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.serializer_lookup_enabled = false
Standard-Serializer-Lookup zu deaktivieren (die ohnehin nicht funktioniert hat); und
# 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
außer Kraft zu setzen, wie Serializer standardmäßig zu finden sind; meine Controller und Serializer sind wie folgt aus:
# 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
...
und
# app/serializers/api/v2/user_serializer.rb
module Api::V2
class UserSerializer < ActiveModel::Serializer
...
nun Dinge wie ActiveModel::Serializer.serializer_for(object)
werden nicht funktionieren, also musste ich auch die API-Version setzen mit example.metadata[:api_version]
Affen meiner Anfrage Specs-Patch vor jedem Test und Erhöhung und Fehler, wenn das Beispiel es nicht eingestellt hat.
So:
- Gibt es eine bessere Art und Weise dokumentiert?
- Ist das annähernd korrekt?
- Werde ich bei diesem Ansatz ein Problem haben?
- Wie kann es verbessert werden?
Vielen Dank für Ihre Eingabe! Ich habe das getan, um die Dinge etwas zu DRY zu machen. 'get_serializer' wird immer von AMS aufgerufen und ich brauche nur' render json: @object, serializer: Namespaced :: Unconventional :: ObjectSerializer' zu verwenden, wenn es nicht der definierten Konvention folgt. –