私はすでにいくつかの質問があり、this is a open issue regarding AMS not handling namespaces too efficiently(このバージョン管理のアプローチで使用されています)があることを知っていますが、現在の制約内で正しいトラックにいることを確認したいと思いました。active_model_serializersでAPIのバージョン管理を実装する正しい方法
今私は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)
のようなものは動作しませんので、私はまた、サルはAPIのバージョンを設定するexample.metadata[:api_version]
を使用して私の要求仕様にパッチを適用する必要がありました例がそれを設定しなかった場合には、各テストの前に、エラーを発生させてください。だから、
:
- が文書化され、より良い方法はありますか?
- これは間違いなく正しいですか?
- 私はこのアプローチでさらに問題に直面していますか?
- どうすれば改善できますか?
ありがとうございました!私は物事を少し乾燥させるためにそれをしました。 'get_serializer'は常にAMSによって呼び出され、定義された規約に従わない場合は' render json:@object、serializer:Namespaced :: Unconventional :: ObjectSerializer'を使うだけです。 –