🐤
【Ruby on Rails】いいね機能
開発環境
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