First command
rails g resource Like user:references post:references
rails db:migrate
class LikesController < ApplicationController
before_action :set_post
def create
@post.likes.create(user: current_user)
render turbo_stream: turbo_stream.replace("like-section-#{@post.id}", partial: "posts/like_section", locals: { post: @post })
end
def destroy
@post.likes.find_by(user: current_user)&.destroy
render turbo_stream: turbo_stream.replace("like-section-#{@post.id}", partial: "posts/like_section", locals: { post: @post })
end
private
def set_post
@post = Post.find(params[:post_id])
end
end
In routes
resources :posts do
resources :likes, only: [:create, :destroy]
resources :comments
end
In show post
<link href="<https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css>" rel="stylesheet">
<turbo-frame id="like-section-<%= @post.id %>">
<%= render partial: "like_section", post: @post %>
</turbo-frame>
In _like_section.html.erb
<turbo-frame id="like-section-<%= @post.id %>">
<% if @post.likes.exists?(user: current_user) %>
<%= button_to post_like_path(@post, @post.likes.find_by(user: current_user)), method: :delete, remote: true, class: "like-button" do %>
<i class="fas fa-heart" style="color: red;"></i>
<% end %>
<% else %>
<%= button_to post_likes_path(@post), method: :post, remote: true, class: "like-button" do %>
<i class="far fa-heart" style="color: gray;"></i>
<% end %>
<% end %>
<div>
Likes: <%= @post.likes.count %>
</div>
</turbo-frame>