いいね!機能の実装方法

いいね機能の実装方法をこちらに記載致します。

まず最初にmoelのlike.rbを作成し、その後、ユーザーモデルと投稿にあたるモデルにhas_manyを使って関連づけます。


class Like < ApplicationRecord
  belongs_to :user
  belongs_to :shop
end

class User < ApplicationRecord
  has_many :likes
end

class Shop < ApplicationRecord
  has_many :likes
end


続いていいね!ボタンを表示したいファイルでの書き方を説明します。
ボタンを押すことにより、見た目が変化するため、if文を設置する必要があります。

<% if current_user.likes.exists?(shop_id: shop.id) %>
  <%= link_to delete_like_path(shop), method: :delete, class: "like-btn" do %>
    <i class="fas fa-heart liked"></i>
  <% end %>
<% else %>
  <%= link_to like_path(shop), method: :post, class: "like-btn" do %>
    <i class="far fa-heart"></i>
  <% end %>
<% end %>

以下のコードをroutes.rb内に記載します。


resources :likes, only: [:create, :destroy]

そして、次にcontrollerファイルを作成し、いいね!をした時としてない時のアクションを作成します。


class LikesController < ApplicationController
  before_action :authenticate_user! # ユーザーがログインしていることを確認するフィルター

  def create
    @shop = Shop.find(params[:id])
    current_user.likes.create(shop: @shop)
    redirect_to shop_path(@shop), notice: 'いいね!しました。'
  end

  def destroy
    @shop = Shop.find(params[:id])
    current_user.likes.find_by(shop: @shop).destroy
    redirect_to shop_path(@shop), notice: 'いいね!を解除しました。'
  end
end

また、ボタンに動きを付けるためにapp/assets/javascriptsにshop.jsを追加する必要があります。
コード内容は以下のようになっています。

<% @shops.each do |shop| %>
  <div class="shop-tile">
    <!-- Shopの情報表示部分 -->

    <!-- いいねボタン -->
    <div class="like-btn">
      <% if current_user.likes.exists?(shop_id: shop.id) %>
        <%= link_to delete_like_path(shop), method: :delete, class: "unlike-link" do %>
          <i class="fas fa-heart liked"></i> いいね解除
        <% end %>
      <% else %>
        <%= link_to create_like_path(shop), method: :post, class: "like-link" do %>
          <i class="far fa-heart"></i> いいね
        <% end %>
      <% end %>
    </div>
  </div>
<% end %>


これらのコードを書くことにより、いいね!ボタンの機能を実装することが出来ます。

この記事が気に入ったらサポートをしてみませんか?