Comment mettre en œuvre plusieurs types de sérialiseurs pour le même modèle à l'aide de Activerecord::Sérialiseurs?
Disons que vous êtes à la mise en œuvre d'une API REST dans les Rails. Lors de la diffusion d'une collection, vous voudrez peut-être que quelques attributs:
/people
Mais lors de la diffusion d'une ressource unique, que vous voulez inclure tous les attributs:
/people/1
Je ne vois pas comment faire à l'aide d'Activerecord::Sérialiseurs, puisque les exemples utilisent tous le modèle de la définition d'un sérialiseur par modèle (avec une convention de nommage) et AMS utiliser automatiquement le droit dans le contrôleur lorsque vous n':
render json: @people
ou:
render json: @person
Vous devez vous connecter pour publier un commentaire.
Pour éviter de mélanger vue des préoccupations dans vos modèles (via sérialisé variations), utilisation de la vue afin de rendre votre JSON pour chaque action, un peu comme nous le faisons pour HTML.
jbuilder & rabl à la fois de combler ce modèles de données ont besoin tout à fait bien.
Mise à jour 2013-12-16: Le ActiveModelSerializers bibliothèque prend en charge la définition de plusieurs sérialiseurs pour un modèle, comme @phaedryx répondre plus tard, en utilisant personnalisé sérialiseurs.
Vous peut plusieurs sérialiseurs pour le même modèle, par exemple
et
simple info pour les personnes dans un contrôleur:
complet info pour les gens d'une autre:
simple info pour une personne seule:
complet info pour une personne seule:
person: {}
pascomplete_person: {}
?root: :person
. Voici un exemple completrender json: @person, serializer: CompletePersonSerializer, root: :person
class CompletePersonSerializer < SimplePersonSerializer
et d'inclure seulement les nouveaux attributsroot: person
pour le sérialiseur de la classe elle-même. Il n'a pas besoin d'être spécifié partout où vous appelezrender json
ou
root :person
génère une erreur.each_serializer: CompletePersonSerializer
est suffisantEn ajoutant à ce que @phaedryx dit, ce que je fais pour cela est d'appeler une méthode qui retourne le bon sérialiseur... pour votre question, je voudrais utiliser: