Подтвердить что ты не робот

Как реализовать несколько разных сериализаторов для одной модели с помощью ActiveModel:: Сериализаторы?

Предположим, вы внедряете REST API в Rails. При обслуживании коллекции вы можете включить только несколько атрибутов:

/people

Но при обслуживании одного ресурса вы хотите включить все атрибуты:

/people/1

Я не вижу, как это сделать с помощью ActiveModel:: Serializers, поскольку все примеры используют шаблон определения одного сериализатора для каждой модели (со стандартным соглашением об именах) и с AMS автоматически используют правильный в контроллере, когда вы делаете:

render json: @people

или

render json: @person
4b9b3361

Ответ 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