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