🐤

【Ruby on Rails】いいね機能

2022/04/18に公開

開発環境

Windows10
cloud9
Ruby2.6.3
Rails6.1.4

本題

※User機能と投稿機能(bookモデル)は作成済みで記述してあります。
1.いいね機能モデルを作成

$ rails g model like

2.マイグレーションファイルの中身を編集

class CreateLikes < ActiveRecord::Migration[6.1]
  def change
    create_table :likes do |t|
      t.integer :user_id ←ここ追加
      t.integer :book_id ←ここ追加
      t.timestamps
    end
  end
end

※integer: 文字列型
3.アソシエーションを設定
※アソシエーションとは?
 モデル同士の繋がりを示すこと。
今回では、ユーザーがいいねを押すことが出来るようにいいね機能を作成中です。
アソシエーションを設定する事で、ユーザーといいね同士が繋がり、誰がいいねしたかが分かります。

like.rb

¦
belongs_to :user
belongs_to :book
¦

いいねとユーザーを繋げます
user.rb

¦
has_many :likes, dependent: :destroy
¦

いいねと投稿(book)を繋げます
book.rb

¦
has_many :likes, dependent: :destroy

def liked_by?(user)
    likes.exists?(user_id: user.id)
end
¦

※liked_by?メソッドを作成する事で、ユーザーidがlikeテーブル内に存在するかどうかを判別しています。(いいねを既に押しているか、押していないか)
bookモデルで定義したものは後ほどviewで使用します。
4.ルーティングを作成

¦
resources :books, only: [:new, :create, :index, :show, :edit, :update, :destroy] do
    resource :likes, [:create, :destroy]
end
¦

※resources → resource 「s」をなくすことで、URLに/:idが含まれなくなります。
いいね機能は、1人のユーザーが1つの投稿にいいねを押すことが出来るのが1回のみなので、URLにparams[:id]を使わなくても良いので「s」を無くした書き方にしています。

5.いいね機能のコントローラーを作成

$ rails g controller likes
class LikesController < ApplicationController

  def create
    book = Book.find(params[:book_id])
    like = current_user.likes.new(book_id: book.id)
    like.save
    redirect_to books_path
  end

  def destroy
    book = Book.find(params[:book_id])
    like = current_user.likes.find_by(book_id: book.id)
    like.destroy
    redirect_to books_path
  end
end

6.いいね機能のviewを作成
今回はbook一覧と詳細ぺージにいいねを押せる設定をします。
部分テンプレートで作成しています。
表示させたいページに<%= render~ %>を使用して表示させて下さい。
_likes.html.erb

<% if book.liked_by?(current_user) %>
<%= link_to  book_likes_path(book), method: :delete do %>
  <i class="fas fa-heart"></i>
  <%= book.likes.count %>
<% end %>
<% else %>
<%= link_to book_likes_path(book), method: :post do %>
  <i class="far fa-heart"></i>
  <%= book.likes.count %>
<% end %>
<% end %>

お疲れ様でした。
何か間違いがありましたら、ご指摘宜しくお願い致します。

Discussion

ログインするとコメントできます