Я знаю, что уже есть некоторые вопросы, а также это открытая проблема, связанная с тем, что 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 перед каждым тестом, а также поднять и выдать ошибку, если в примере это не установлено.
So:
- Есть ли лучший способ задокументировать?
- Это близко к правильному?
- Буду ли я сталкиваться с проблемой при таком подходе?
- как это может быть улучшено?