#やりたいこと
投稿に対してユーザーがいいねする機能を実装したい!
今やどのWebサービスにも搭載している機能ですね。
Rails勉強中の方は是非この記事を読んで、
やり方を理解して実装できるようになれるようになってください!!
わからないことがあればコメントお願いします!!
#やり方
##前提
userとpostテーブルがあり、userが親、postが子の親子関係です。
モデル、ルーティング、コントローラー、ビューをそれぞれ説明していきます。
##モデル
###モデル作成
まずFavoriteモデルを作成します
ターミナルから作成しましょう
rails g model Favorite
###モデル編集
その作成されたモデルのファイルにアソシエーションの関係を追記していきましょう
class User < ApplicationRecord
has_many :posts, dependent: :destroy
has_many :favorites, dependent: :destroy
end
has_many :posts, dependent: :destroy
has_many :favorites, dependent: :destroy
を追記しましょう
has_many
は1つのuserは複数のpost、favoriteを持っているような時に記載します
dependent: :destroy
は親のレコードを削除した時に
関連している子供のレコードも全て削除するための記述です。
この記述がある時は、あるuserが削除されるとそのuserが持っているpostを全て削除されます。
class Post < ApplicationRecord
belongs_to :user
has_many :favorites, dependent: :destroy
end
belongs_to :user
has_many :favorites, dependent: :destroy
を追記しましょう。
belongs_to
は1つのpostは1つはuserを持っているような時に記載します。
class Favorite < ApplicationRecord
belongs_to :user
belongs_to :post
end
belongs_to :user
belongs_to :post
を追記しましょう
###マイグレーションファイルの編集
次は、モデルを編集した後はテーブルを作成しましょう
以下の3つのマイグレーションファイルにそれぞれ追記していきましょう
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.integer :user_id
t.integer :post_id
t.timestamps
end
end
end
t.integer :user_id
t.integer :post_id
を追記しましょう。
マイグレーションファイル編集後はbundle install
をしましょう。
bundle install
bundle install
が成功するとテーブルが作成されます。
##ルーティング
まず、ルーティングを以下を追記しましょう。
resources :posts do
resource :favorites, only: [:create, :destroy]
end
ターミナル上でrails routes
を行いルーティングが通っているか確認しましょう
##コントローラー
まずコントローラーを作成しましょう
rails generate controller Favorites
###favorites_controller
作成されたコントローラーを編集していきます
いいねボタンが押された時に繋がるアクションを記述していきましょう
####createアクション
def create
@post_favorite = Favorite.new(user_id: current_user.id,post_id: params[:post_id])
@post_favorite.save
result = [done: "save",user_id: current_user.id, post_id: params[:post_id]]
redirect_to post_path(params[:post_id])
end
####destroyアクション
def destroy
@post_favorite = Favorite.find_by(user_id: current_user.id, post_id: params[:post_id])
@post_favorite.destroy
result = [done: "destroy",user_id: current_user.id, post_id:params[:post_id]]
redirect_to post_path(params[:post_id])
end
##ビュー
いいねボタンを投稿の詳細画面に実装していきます
まず、ログインしているユーザーが投稿に対していいねしているかどうかで表示内容を変更します。
def favorited?(user)
favorites.where(user_id: user.id).exists?
end
モデルにいいねしているかどうかを判定するメソッドを記入します
if @post.favorite?(current_user)
#ユーザーがいいねしていた時の処理(destroyアクションへのリンク)
else
#ユーザーがいいねしていない時の処理(createアクションへのリンク)
end
実際にビューファイルに以下の記述を追加していきましょう
<%if @post.favorite?(current_user)%>
<%= link_to post_favorites_path(@post), method: :delete do %>
<span style="color:red;">❤︎</span>
<%end%>
<%else%>
<%= link_to post_favorites_path(@post), method: :post do %>
<span>❤︎</span>
<%end%>
<%end%>
疑問、気になるところございました、コメントください!!