Let\'s say you\'re implementing a REST API in Rails. When serving a collection, you might want to only include a few attributes:
/people
B
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
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
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.
class CompletePersonSerializer < ActiveModel::Serializer
root :person
attributes :id, :name, :phone, :email
end
or
render json: @people, each_serializer: CompletePersonSerializer, root: :person