How to implement multiple different serializers for same model using ActiveModel::Serializers?

五迷三道 提交于 2019-11-28 03:20:29

To avoid mixing view concerns into your models (via serialized variations), use the view to render your JSON for each action, much like we do for HTML.

jbuilder & rabl both fill this data templating need quite nicely.

Update 2013-12-16: The ActiveModelSerializers library does support defining multiple serializers for one model, as @phaedryx answered later, by using custom serializers.

You can have multiple serializers for the same model, e.g.

class SimplePersonSerializer < ActiveModel::Serializer
  attributes :id, :name
end

and

class CompletePersonSerializer < ActiveModel::Serializer
  attributes :id, :name, :phone, :email
end

simple info for people in one controller:

render json: @people, each_serializer: SimplePersonSerializer

complete info for people in another:

render json: @people, each_serializer: CompletePersonSerializer

simple info for a single person:

render json: @person, serializer: SimplePersonSerializer

complete info for a single person:

render json: @person, serializer: CompletePersonSerializer
class CompletePersonSerializer < ActiveModel::Serializer
  root :person
  attributes :id, :name, :phone, :email
end

or

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

Adding to what @phaedryx said, what I do for this is call a method that returns the correct serializer... for your question, I'd use:

class MyController < ApplicationController

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

  private

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

end
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!