L'essentiel de Ruby on Rails

Solution : Corriger les bogues et optimiser son application

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Ce défi est l'un des plus complexes de cette formation en raison du nombre de notions à mettre en œuvre. Visionnez les solutions proposées et n'hésitez pas à les réviser plusieurs fois pour bien les assimiler.
07:35

Transcription

Je vais, dans cette vidéo, résoudre cet exercice, qui contenait pas mal d'objectifs conséquents. Commençons par le premier point, la correction des bugs qui se sont insérés dans l'application. Peut être, aviez-vous remarqué, que lorsque vous essayez d'éditer un sujet de discussion, vous tombiez éventuellement sur cette erreur. Si vous regardez dans les journaux de votre application, vous verrez ici Unpermitted parameter :id. Cela signifie que nous avons oublié d'autoriser l'édition de l'ID de pictures attribute au sein de notre controller topics. Avant de corriger ce bug, je vous présente cette petite ligne, qui va vous permettre de rendre ces erreurs invisibles beaucoup plus visibles. Après avoir relancé votre serveur, maintenant vous avez plutôt cette erreur qui est, à mon sens, plus compréhensible. Il nous reste donc ici à rajouter, le .id. Une autre petite chose, dans la page de visualisation des sujets de discussion est d'utiliser ici plutôt, find? Cette méthode nous vient directement de Paperclip, et permettra de vérifier convenablement l'existence d'un fichier. Enfin, pour les bugs, trois petites choses. Enfin, ce ne sont pas vraiment des bugs mais ça pourrait être considéré comme tel. Ici, nous avons oublié de rajouter input :published. Évidemment, si vous l'ajoutez, n'oubliez pas de permettre son édition au sein des topics params. Une autre chose serait de rediriger vers le sujet de discussion lorsque nous supprimons une réponse, plutôt que de rediriger vers la liste des sujets. Nous pouvons donc ici mettre topic_answer.topic. Enfin, vous avez peut être remarqué que vous avez des erreurs lorsque vous essayez de sauvegarder un sujet de discussion sans image. Ceci est dû à la présence de validate true ici, qui va forcément valider la présence de l'image. Mettez plutôt false, puisque nous ne voulons par forcément qu'un sujet de discussion ait une image. Bien, nous allons maintenant faire de notre page liste de discussion, notre page d'accueil. Pour cela, remplacez ici, par topics#index. Vous pouvez maintenant supprimer la page Home et la supprimez également du controller. Reste à remplacer le lien par le layout. Nous retirons donc ici la ligne link to accueil. Et remplaçons ici par routes path. Nous allons maintenant verrouiller les accès aux créations et initions des sujets et réponses que pour les utilisateurs authentifiés. Pour les réponses, nous verrouillons tout, sauf l'action show. Pour les sujets de discussion, nous autorisons les actions index et show, pour les utilisateurs anonymes. Passons maintenant dans la vue index des sujets de discussion. Nous pouvons rajouter ici une classe CSS pour un peu styliser cela. Puis remplaçons ce code, par celui-ci. La différence majeure est ici l'usage de la méthode user signed in pour vérifier si l'utilisateur est actuellement authentifié pour afficher les boutons Éditer et Supprimer. Utilisons là également pour empécher l'affichage de ce bouton. Appliquons également cette méthode à la page de visualisation d'un sujet de discussion. J'en profite pour rajouter également, un peu de style. Le masquage du bouton Catégorie, est lui-même, assez simple. Il suffit d'utiliser la méthode user_signed_in? combiné à current_user.is_admin? Attaquons-nous maintenant à la notion d'auteur des messages. Exécutons cette migration. Dans le fichier de migration, ajoutons également la référence en réponse vers notre utilisateur. Exécutez rails debit migrates et n'oubliez pas d'ajouter les associations Belongs to et Ask many dans les modèles topic, topic_answers et user. Pour le belongs to user, vous pouvez utiliser le concern topic able, ça ira plus vite. Ensuite, pour associer un sujet de discussion et une réponse à un utilisateur, cela n'est pas très compliqué. Il suffit ici de mettre current_user, à la place de base de @topic. Puis de renseigner la liason avec le topic, comme ceci. Notez que nous aurions pû également faire l'inverse, à savoir mettre topic_answer.user =current user. Ôtez le sujet de discussion, nous remplaçons ici topic par current_user.topics.build. Nous allons maintenant verrouiller les accès en édition et en suppression, cause auteurs des sujets de discussions, et réponse. Plutôt que de dupliquer le test un peu partout dans le code, nous allons rajouter une méthode au niveau de notre modèle user. La méthode can manage, prendra en paramètre une donnée, et nous vérifierons ensuite si l'utilisateur est soit un administrateur, soit, si l'utilisateur associé à la donnée est celui sur lequel nous appelons la méthode. Verrouillons maintenant les actions des controllers. Nous allons rajouter un before_action :verify_author!, pour vérifier si l'utilisateur actuel est bien l'auteur des données accédées. Cette méthode veut utiliser la méthode can manage nouvellement créée pour vérifier que l'utilisateur peut éditer la réponse. Faites de même pour les sujets de discussion. Attaquons-nous maintenant aux vues. Comme dans les vues, nous allons vérifier, à la fois, si l'utilisateur est authentifié et s'il peut éditer la donnée. Nous allons créer pour cela un helper. Il est usuel de donner le même nom que les méthodes que nous avons créées dans notre modèle user. De cette façon, nous pourrons, plus facilement, retrouver le lien entre la méthode de notre modèle user et ce helper. Nous pouvons ensuite réutiliser la méthode dans les vues, ici, au sein de la liste des réponses, au niveau de l'index de nos sujets de discussion, et de la page de visualisation d'un sujet de discussion. Passons maintenant à l'affichage uniquement des sujets de discussion et réponses publiées. Pour cela, vous pouvez utiliser le mot-clé next qui permettra de sauter l'affichage d'un sujet de discussion, à moins que l'une de ces deux conditions ne soit remplie. Faisons de même, au niveau des réponses. Nous pouvons maintenant supprimer le lien que nous avions ici, sujet publié. N'oubliez pas de supprimer également la routes et l'action du controller correspondant. Attaquons-nous au dernier point qui consiste à associer un vote à l'utilisateur actuellement connecté. Nous n'aurons plus besoin ici, de ce before_action, on le supprime. Supprimez également la méthode correspondante. Et au niveau de upvote et downvote, remplacez les occurences de @user par current_user. Maintenant, dans la page de visualisation d'un sujet de discussion, il nous faut masquer les boutons upvote et downvote, si l'utilisateur n'est pas connecté. Pour cela, nous pouvons remplacer ce code, par celui-ci. Nous vérifions ici, si l'utilisateur est connecté et si c'est le cas, nous affichons les boutons de download et upload. Cette vidéo a résolu un exercice assez conséquent. Vous voyez qu'en prenant les problèmes un à un, et en allant pas à pas, nous finissons par tout résoudre.

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 !