REST APIをRailsで実装しているとしましょう。コレクションを提供する場合、いくつかの属性のみを含めることができます:
/people
ただし、単一のリソースを提供する場合は、すべての属性を含める必要があります。
/people/1
ActiveModel :: Serializersを使用してこれを行う方法はわかりません。すべての例では、モデルごとに1つのシリアライザーを定義するパターンを使用し(標準の命名規則を使用)、AMSがコントローラーで正しいものを自動的に使用するようにしているためです。
render json: @people
または:
render json: @person
ビューの懸念がモデルに(シリアル化されたバリエーションを介して)混在しないようにするには、HTMLの場合と同様に、ビューを使用してアクションごとにJSONをレンダリングします。
jbuilder & rabl 両方とも、このデータテンプレートのニーズを非常にうまく満たします。
Update 2013-12-16: ActiveModelSerializers ライブラリは、@ phaedryxが後で回答したように、1つのモデルに対して複数のシリアライザーの定義をサポートしています カスタムシリアライザ を使用します。
can同じモデルに複数のシリアライザーがあります。
class SimplePersonSerializer < ActiveModel::Serializer
attributes :id, :name
end
そして
class CompletePersonSerializer < ActiveModel::Serializer
attributes :id, :name, :phone, :email
end
1つのコントローラーの人々のための簡単な情報:
render json: @people, each_serializer: SimplePersonSerializer
他の人の完全な情報:
render json: @people, each_serializer: CompletePersonSerializer
一人のための簡単な情報:
render json: @person, serializer: SimplePersonSerializer
一人の完全な情報:
render json: @person, serializer: CompletePersonSerializer
class CompletePersonSerializer < ActiveModel::Serializer
root :person
attributes :id, :name, :phone, :email
end
または
render json: @people, each_serializer: CompletePersonSerializer, root: :person
@phaedryxが言ったことに加えて、私がこれを行うのは正しいシリアライザを返すメソッドを呼び出すことです...あなたの質問には、私は使用します:
class MyController < ApplicationController
def index
render json: @people, each_serializer: serializer_method
end
private
def serializer_method
defined?(@people) ? PeopleSerializer : PersonSerializer
end
end