0
0

More than 1 year has passed since last update.

【Rails】投稿へのいいね!表示方法をコードにふりがな振ってまとめておく

Last updated at Posted at 2022-06-26

処理の順序

  1. 自分のログイン状況を判別して
  2. 自分がその投稿に「いいね!」したかによって
  3. 表示とリンクを変える

出来上がりの目標

まずは出来上がりの見た目をイメージします。
スライド1.JPG

準備したもの

この機能を実装するのに必要な最低限のファイルです

モデル

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]}")

上のコードにふりがなを振ったものがこちらです。
スライド2.JPG

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 %>

上のコードにふりがなを振ったものがこちらです。
スライド3.JPG

ルーティング

ルーティングの設定は下記です。

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"}を忘れない
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0