Je vais le préparer moi-même.
** Modèle de contrôleur créé **
routes.erb
  Rails.application.routes.draw do
    resources :posts do
      resources :comments, only: [:create, :destroy]
      resource :likes, only: [:create, :destroy]
    end
  end
aime devient ** ressource ** car il n'est pas nécessaire de donner un identifiant
post.rb
  def liked_by?(user)
    likes.where(user_id: user.id).exists?
  end
Vous pouvez vérifier si vous l'aimez
likes_controller.rb
class LikesController < ApplicationController
  def create
    @post = Post.find_by(id: params[:post_id])
    #Conditions pour éviter les clics continus
    unless @post.liked_by?(current_user)
      @like = current_user.likes.new(post_id: @post.id)
      @like.save
    end
  end
  def destroy
    @post = Post.find_by(id: params[:post_id])
    @like = current_user.likes.find_by(post_id: @post.id)
    @like.destroy
  end
end
La redirection n'est pas nécessaire pour créer et détruire respectivement, supprimez-le si décrit.
ruby:posts/show.html.slim
#Donnez un identifiant car il faut en faire Ajax
div id='like_#{ @post.id }'
   #Partialiser l'icône similaire
   = render 'like', post: @post
ruby:posts/_like.html.slim
#Supprimer comme
- if post.liked_by?(current_user)
  = link_to post_likes_path(post), method: :delete, remote: true do
    i.fas.fa-heart style='color: red;'
    = post.likes.count
#Comme c'est gentil
- else
  = link_to post_likes_path(post), method: :post, remote: true do
    i.far.fa-heart
    = post.likes.count
Appeler un fichier JavaScript avec ** remote: true **
ruby:likes/create.js.erb
$("#like_<%= @post.id %>").html("<%= j(render 'posts/like', post: @post ) %>");
ruby:likes/destroy.js.erb
$("#like_<%= @post.id %>").html("<%= j(render 'posts/like', post: @post ) %>");
**Achevée! ** **
Recommended Posts