web-dev-qa-db-ja.com

ActiveModel :: Serializersを使用して同じモデルに複数の異なるシリアライザーを実装する方法は?

REST APIをRailsで実装しているとしましょう。コレクションを提供する場合、いくつかの属性のみを含めることができます:

/people

ただし、単一のリソースを提供する場合は、すべての属性を含める必要があります。

/people/1

ActiveModel :: Serializersを使用してこれを行う方法はわかりません。すべての例では、モデルごとに1つのシリアライザーを定義するパターンを使用し(標準の命名規則を使用)、AMSがコントローラーで正しいものを自動的に使用するようにしているためです。

render json: @people

または:

render json: @person
36
odigity

ビューの懸念がモデルに(シリアル化されたバリエーションを介して)混在しないようにするには、HTMLの場合と同様に、ビューを使用してアクションごとにJSONをレンダリングします。

jbuilderrabl 両方とも、このデータテンプレートのニーズを非常にうまく満たします。

Update 2013-12-16ActiveModelSerializers ライブラリは、@ phaedryxが後で回答したように、1つのモデルに対して複数のシリアライザーの定義をサポートしています カスタムシリアライザ を使用します。

4
Mars

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
113
phaedryx
class CompletePersonSerializer < ActiveModel::Serializer
  root :person
  attributes :id, :name, :phone, :email
end

または

render json: @people, each_serializer: CompletePersonSerializer, root: :person
10

@phaedryxが言ったことに加えて、私がこれを行うのは正しいシリアライザを返すメソッドを呼び出すことです...あなたの質問には、私は使用します:

class MyController < ApplicationController

  def index
    render json: @people, each_serializer: serializer_method
  end

  private

  def serializer_method
    defined?(@people) ? PeopleSerializer : PersonSerializer
  end

end
2
tehprofessor