So che ci sono già alcune domande e anche this is a open issue regarding AMS not handling namespaces too efficiently (che viene utilizzato da questo approccio di versioning) ma volevo essere sicuro di essere nella giusta direzione all'interno dei vincoli attuali.Modo corretto per implementare il versioning dell'API con active_model_serializers
In questo momento sto usando Rails 5 e AMS 0.10.1, così ho fatto la seguente:
# config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.serializer_lookup_enabled = false
per disabilitare ricerca predefinito serializzatore (che non ha funzionato in ogni caso); 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
per sovrascrivere il modo in cui i serializzatori vengono trovati per impostazione predefinita; i miei controllori e serializzatore sono come questo:
# 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
...
Ora, le cose come ActiveModel::Serializer.serializer_for(object)
non funziona, quindi ho dovuto anche scimmia Patch My richiesta specifiche utilizzando example.metadata[:api_version]
per impostare la versione API prima di ogni test e innalzamento e errore se l'esempio non l'ha impostato.
Quindi:
- c'è un modo meglio documentate?
- È tutto vicino ad essere corretto?
- Avrò problemi con questo approccio?
- Come può essere migliorato?
Grazie per l'input! L'ho fatto per ASCIUGARE un po 'le cose. 'get_serializer' è sempre chiamato da AMS e ho solo bisogno di usare' render json: @object, serializer: Namespaced :: Unconventional :: ObjectSerializer' se non segue la convenzione definita. –