L'essentiel de Ruby on Rails

Travailler avec l'association has_many/belongs_to

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
L'association X et 1 n'est guère plus compliquée à mettre en place que l'association 1 et 1. En revanche, elle est nettement plus utilisée, et elle vous permettra de lier vos sujets à vos réponses.
05:49

Transcription

Cette vidéo va vous faire pratiquer l'association 1X has_many belongs to. Nous allons en effet associer nos données Topics avec nos données Topics Answers représentant les réponses à nos sujets de discussion. Commençons par générer la migration pour ajouter la clé étrangère au niveau de Topics Answers. N'oubliez pas d'exécuter Rake db:migrate. Rendons-nous ensuite dans nos modèles. Dans l'association, une réponse appartient à un sujet de discussion. On rajouter donc ici Belongs_to :topic. Nous pouvons également ajouter l'option touch: true. Dès qu'un utilisateur ajoutera une réponse à un sujet de discussion, cela mettra à jour la colonne Updated_at du sujet de discussion. De cette façon, vous pourriez imaginer de trier vos sujets de discussion par date de mise à jour, pour avoir ainsi en premier les sujets de discussions ayant une réponse récente. Côté sujet de discussion, nous rajoutons Has_many puisqu'un sujet de discussion a plusieurs réponses. Nous pouvons également ajouter l'option ici Dependent: destroy pour faire en sorte que si un sujet de discussion est supprimé, l'ensemble de ses réponses le sont aussi. Maintenant que nous avons ajouté ces méthodes, nous avons accès à un ensemble de nouvelles méthodes nous permettant de récupérer des réponses à partir d'un sujet de discussion. Voyons comment en allant dans le contrôleur Topics Controller. Nous allons modifier l'action Show pour ne récupérer que les réponses du sujet de discussion actuellement visualisé. Pour récupérer les réponses, nous pouvons tout bonnement utiliser Topic.topic_answers. Notez le « s » ici qui représente bien l'association Has_many. C'est-à-dire qu'un sujet de discussion a plusieurs réponses. Remplaçons également l'initialisation. Ici il nous faut utiliser la méthode Build sur la collection Topics answers. Topic answers représente effectivement une collection de réponses du sujet de discussion. Contrairement à l'association Has_one où nous aurions eu la méthode Build_topic_answers, lorsque nous avons une association Has_many, les méthodes d'initialisation comme Build ou Create s'utilisent sur la collection comme ceci. Mais comment faire lorsque nous créons une réponse pour l'associer à notre sujet de discussion ? Il y a pour cela plusieurs solutions. L'une d'entre elles consiste à ajouter un champ caché au sein du formulaire contenant l'ID de notre sujet de discussion. Une autre, plus usuelle, est d'inclure l'ID de l'autre sujet de discussion à l'intérieur de l'URL vers laquelle est postée le formulaire. Nous allons mettre en place cette seconde méthode. Nous allons pour cela, vous vous en doutez, rajouter une root. Rajoutez ici : post post-answer et associez-la à l'action Create du contrôleur Topic answers. Nous pouvons du coup ici, retirez les actions New et Create qui ne seront plus utilisées. Voici la root qui est générée grâce à cette nouvelle route post post-answer. Nous allons réutiliser cette méthode ici pour la mettre au sein de notre formulaire de création de réponse. Ajoutez ici l'option URL et mettez votre méthode. Passez en paramètre la donnée Topic. Il ne nous reste plus qu'à modifier l'action Create du contrôleur Topic-answers. Nous pouvons ici supprimer l'action New qui n'est plus utilisée. Et modifions l'action Create. Nous récupérons d'abord le topic issu de l'URL. Puis nous remplaçons ceci par @topic.topic_answers.build en lui donnant le même paramètre que la méthode New. Build d'ailleurs, vous le remarquez, peut être assimilé à la méthode New que vous utilisez directement sur le nom du modèle. Build va en effet permettre d'initialiser une donnée topic_answers relative à topic. Elle aura pour effet de renseigner automatiquement l'attribut topic ID de la donnée topic_answers qui est créée. Nous pouvons également ici rediriger vers le sujet de discussion. Et en cas d'erreur, il ne faut pas oublier de récupérer l'ensemble des réponses du topic qui sont nécessaires sur la page de visualisation de notre sujet de discussion. Puisque cette méthode sera identique à celle-ci, nous ne souhaitons pas dupliquer du code. Aussi, allons-nous créer une nouvelle méthode au sein de notre modèle Topic pour récupérer l'ensemble de ces réponses. Nous l'appellerons Get_answers Il faudra lui fournir en paramètre la page de pagination. Créons cette méthode. Et remettons ici la récupération des réponses. N'oubliez pas de remplacer params[ :page] par le paramètre de la méthode. Nous pouvons du coup réutiliser la méthode ici. Si vous rafraîchissez, vous obtiendrez une erreur. N'oubliez en effet pas le mot-clé _path, _url lorsque vous utilisez une méthode issue du fichier Root. Ces indications ici n'étaient pas forcément fournies lors des précédentes versions de Ruby on Raise. Aussi, je vous montre cette erreur car elle est usuelle dans le développement Ruby on Raise. Ajoutez donc _path. Et voilà, votre formulaire de création de réponse fonctionne. Et vous avez ici l'ensemble des réponses à un sujet de discussion donnée. Nous avons donc vu, grâce à l'association Has_many Belongs to, comment lier une donnée sujet de discussion à un ensemble de réponses.

L'essentiel de Ruby on Rails

Concevez des applications web évolutives et intemporelles avec Ruby on Rails. Installez l’environnement, réalisez un projet de stack overflow, enrichissez-le, etc.

6h08 (85 vidéos)
Aucun commentaire n´est disponible actuellement

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !