処理の順序
- 自分のログイン状況を判別して
- 自分がその投稿に「いいね!」したかによって
- 表示とリンクを変える
出来上がりの目標
準備したもの
この機能を実装するのに必要な最低限のファイルです
モデル
Postモデル 投稿に関する情報を保存するdb
id
カラム: 投稿id 投稿作成と同時に付与される
Userモデル ユーザーに関する情報を保存するdb
id
カラム: ユーザーid 投稿作成と同時に付与される
Likeモデル いいね!に関する情報を保存するdb
post_id
カラム: どの投稿へのいいね!か
user_id
カラム: 誰によるいいね!か
コントローラ
postsコントローラ
show
アクション: 投稿詳細ページ いいね!を表示させるページでもある
likesコントローラ
create
アクション: いいね!する
likes_controller.rb
# createアクション内で
@like = Like.new(user_id: @current_user.id, post_id: params[:post_id])
@like.save
redirect_to("/posts/#{params[:post_id]}")
destroy
アクション: いいね!を取り消す
likes_controller.rb
# destroyアクション内で
@like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id])
@like.destroy
redirect_to("/posts/#{params[:post_id]}")
Applicationコントローラ 元からあるコントローラ
set_current_user
アクション: 現在ログイン中のユーザーを@変数に代入
application_controller.rb
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
ビューファイル
posts/show
/posts/:idに対してこのビューファイルを返します。
このファイル内で投稿内容や、その投稿に対していいね!しているかどうかを表示します。
show.html.erb
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
<%= link_to(“いいね!済み”, “/likes/#{@post.id}/destroy” {method: “post”}) %>
<% else %>
<%= link_to(“いいね!”, “/likes/#{@post.id}/create” {method: “post”}) %>
<% end %>
ルーティング
ルーティングの設定は下記です。
route.rb
# 投稿idに対して投稿詳細ページを表示する
get "posts/:id" => "posts#show"
# 投稿idを受け取りいいね!を作成する
post "likes/:post_id/create" => "likes#create"
# 投稿idを受け取りいいね!を削除する
post "likes/:post_id/destroy" => "likes#destroy"
ポイント
- Likeモデルにユーザーidと投稿idに対応するカラムを用意する
- 現在ログイン中のユーザーを定義する
- ビューファイル内でのLink_toで飛ばす先はpostなので
{method: "post"}
を忘れない