Comment ajouter du goût et de l'inquiétude dans les rails

La deuxième semaine du projet d'ingénierie de notre Makers Academy a commencé. Nous avons eu jusqu’à présent une expérience formidable avec les rails et nous avons maintenant l’impression de nous attaquer aux aspects les plus compliqués. Ce guide est une introduction rapide à l’ajout de "j'aime" aux articles.

Créer le contrôleur et le modèle

Vous devez d’abord générer le modèle:

rails g model Comme post: références utilisateur: références

Puis migrez la table:

rails db: migrer

Et enfin, ajoutez le contrôleur:

rails g contrôleur aime

Ajouter la méthode create au contrôleur

class LikesController 
  def crée
    @ post.likes.create (user_id: current_user.id)
    redirect_to post_path (@post)
  fin
  privé
  def find_post
    @post = Post.find (params [: post_id])
  fin
fin

Dans app / views / posts / show.html.erb, ajoutez le code suivant:

<% = button_to 'Like', post_likes_path (@post), méthode:: post%>

Dans routes.rb imbrique la ressource de commentaires dans la ressource de publications:

ressources: posts do
  ressources: aime
fin

Etablissez maintenant la relation un à plusieurs entre les publications / utilisateurs et les "J'aime". Vous faites ça comme ça:

Dans app / models / post.rb et app / models / user.rb, ajoutez la ligne suivante:

has_many: aime, dépendant:: détruire

La première partie donne la relation entre les articles / utilisateurs et leurs goûts. La deuxième partie garantit que lorsque vous supprimez un message / utilisateur, tous leurs goûts sont supprimés.

Dans app / views / posts / show.html.erb, ajoutez cette ligne pour afficher le nombre de mentions de j'aime d'un article:

<% = @ post.likes.count%> <% = (@ post.likes.count) == 1? 'J'aime': 'J'aime'%>

Ensuite, dans app / views / posts / index.html.erb, ajoutez cette ligne pour afficher le nombre de mentions de J'aime dans une publication sur la page d'accueil:

<% = post.likes.count%> <% = (post.likes.count) == 1? 'J'aime': 'J'aime'%>

Ceci est pour montrer le nombre de goûts. Le bit de logique est ensuite de changer en Like ou Likes en fonction du nombre.

Arrêtez les gens qui aiment plus d'une fois

Nous devons d’abord ajouter une méthode pour vérifier si un utilisateur a déjà aimé une photo. Sous le mot privé, ajoutez:

def déjà_a aimé?
  Like.where (user_id: current_user.id, post_id:
  params [: post_id]). existe?
fin

Puis éditez votre méthode create pour en rendre compte

def crée
  si vous avez déjà aimé?
    flash [: notice] = "Vous ne pouvez pas aimer plus d'une fois"
  autre
    @ post.likes.create (user_id: current_user.id)
  fin
  redirect_to post_path (@post)
fin

L’instruction ‘if’ vérifie s’il existe un élément similaire dans la base de données avec les ID utilisateur et post_id actuels, ce qui signifie qu’ils doivent avoir déjà aimé. Si tel est le cas, nous n’en ajouterons pas un autre et nous afficherons un message d’erreur.

Ajout de la fonctionnalité différente

Dans le contrôleur de préférences, nous devons ajouter une méthode de destruction:

def détruire
  si! (déjà_a aimé?)
    flash [: notice] = "Ne peut pas ressembler"
  autre
    @ like.destroy
  fin
  redirect_to post_path (@post)
fin

Avec cette méthode, je veille également à ce qu’ils ne ressemblent pas quand ils n’ont pas aimé.

Pour supprimer un élément similaire, vous devez le trouver. Par conséquent, nous devons ajouter une méthode find_like.

def find_like
   @like = @ post.likes.find (params [: id])
fin

Et assurez-vous que cette méthode est appelée sur la méthode destroy. Placez ceci en haut du contrôleur:

before_action: find_like, uniquement: [: destroy]

La seule chose à faire maintenant est d'ajouter un bouton différent et assurez-vous qu'il s'affiche si vous cliquez comme suit:

<% pre_like = @ post.likes.find {| like | like.user_id == current_user.id}%>
<% si pre_like%>
  <% = button_to 'Contrairement à', post_like_path (@post, pre_like), méthode:: delete%>
<% else%>
  <% = button_to 'Like', post_likes_path (@post), méthode:: post%>
<% end%>

Je commence par trouver le même avec l'identifiant de l'utilisateur. S'il y en a un, je montre le bouton Contrairement et sinon, je rends le bouton J'aime. Lorsque l'utilisateur clique sur Supprimer, je passe le message et les éléments similaires, qu'il trouve à l'aide de find_post et de find_like, puis les détruit.

Et tu as fini!