Как реализовать несколько разных сериализаторов для одной модели с помощью ActiveModel:: Сериализаторы?
Предположим, вы внедряете REST API в Rails. При обслуживании коллекции вы можете включить только несколько атрибутов:
/people
Но при обслуживании одного ресурса вы хотите включить все атрибуты:
/people/1
Я не вижу, как это сделать с помощью ActiveModel:: Serializers, поскольку все примеры используют шаблон определения одного сериализатора для каждой модели (со стандартным соглашением об именах) и с AMS автоматически используют правильный в контроллере, когда вы делаете:
render json: @people
или
render json: @person
Ответы
Ответ 1
Чтобы избежать проблем с отображением взглядов в ваших моделях (с помощью сериализованных вариаций), используйте представление для рендеринга вашего JSON для каждого действия, как и для HTML.
jbuilder и rabl оба заполнить эти шаблоны данных нужны довольно хорошо.
Обновление 2013-12-16: библиотека ActiveModelSerializers поддерживает определение нескольких сериализаторов для одной модели, поскольку @phaedryx ответил позже, используя настраиваемые сериализаторы.
Ответ 2
У вас может быть несколько сериализаторов для одной и той же модели, например.
class SimplePersonSerializer < ActiveModel::Serializer
attributes :id, :name
end
и
class CompletePersonSerializer < ActiveModel::Serializer
attributes :id, :name, :phone, :email
end
простая информация для людей в одном контроллере:
render json: @people, each_serializer: SimplePersonSerializer
полная информация для людей в другой:
render json: @people, each_serializer: CompletePersonSerializer
простая информация для одного человека:
render json: @person, serializer: SimplePersonSerializer
полная информация для одного человека:
render json: @person, serializer: CompletePersonSerializer
Ответ 3
class CompletePersonSerializer < ActiveModel::Serializer
root :person
attributes :id, :name, :phone, :email
end
или
render json: @people, each_serializer: CompletePersonSerializer, root: :person
Ответ 4
Добавляя к тому, что сказал @phaedryx, я делаю для этого вызов метода, который возвращает правильный сериализатор... для вашего вопроса я бы использовал:
class MyController < ApplicationController
def index
render json: @people, each_serializer: serializer_method
end
private
def serializer_method
defined?(@people) ? PeopleSerializer : PersonSerializer
end
end