42

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

/people

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

/people/1

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

render json: @people

また:

render json: @person
4

4 に答える 4

125

同じモデルに対して複数のシリアライザーを使用できます。

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
于 2012-10-25T15:48:36.697 に答える
4

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

jbuilderrablはどちらも、このデータ テンプレートのニーズをうまく満たしています。

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

于 2012-09-27T04:50:58.667 に答える
2

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

class MyController < ApplicationController

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

  private

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

end
于 2013-10-10T20:30:11.537 に答える