tutorial rails elaborando crear con apis ruby-on-rails-3 json rest activemodel

ruby-on-rails-3 - elaborando - rest rails



¿Cómo implementar varios serializadores diferentes para el mismo modelo usando ActiveModel:: Serializers? (4)

Agregando a lo que dijo @phaedryx, lo que hago para esto es llamar a un método que devuelve el serializador correcto ... para su pregunta, usaría:

class MyController < ApplicationController def index render json: @people, each_serializer: serializer_method end private def serializer_method defined?(@people) ? PeopleSerializer : PersonSerializer end end

Digamos que estás implementando una API REST en Rails. Al servir una colección, es posible que desee incluir solo algunos atributos:

/people

Pero cuando se sirve un único recurso, debe incluir todos los atributos:

/people/1

No veo cómo hacerlo utilizando ActiveModel :: Serializadores, ya que todos los ejemplos utilizan el patrón de definición de un serializador por modelo (con una convención de nomenclatura estándar) y tener AMS usa automáticamente el correcto en el controlador cuando lo hace:

render json: @people

o:

render json: @person


Para evitar mezclar problemas de visualización en sus modelos (a través de variaciones serializadas), use la vista para representar su JSON para cada acción, al igual que hacemos para HTML.

jbuilder y rabl ambos llenan esta información de las plantillas necesitan bastante bien.

Actualización 2013-12-16 : la biblioteca ActiveModelSerializers admite la definición de varios serializadores para un modelo, como @phaedryx respondió más adelante, mediante el uso de serializadores personalizados .


Puede tener varios serializadores para el mismo modelo, por ejemplo,

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

y

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

información simple para personas en un controlador:

render json: @people, each_serializer: SimplePersonSerializer

información completa para personas en otro:

render json: @people, each_serializer: CompletePersonSerializer

información simple para una sola persona:

render json: @person, serializer: SimplePersonSerializer

información completa para una sola persona:

render json: @person, serializer: CompletePersonSerializer


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

o

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