😊

[Rails]いいね機能の作成(ルーティング・コントローラ編)

に公開

前回書いた記事に引き続き、いいね機能をまとめていきます。


ルーティング

# tasksコントローラのルーティング
resources :tasks, only: [:new, :create, :index, :show, :edit, :update, :destroy] do
  resource :favorite, only: [:create, :destroy]
  resources :task_comments, only: [:create, :destroy], as: "comments"
end

resources 部分

resources はルーティングを一括作成するもの。

resources :tasks, only: [:new, :create, :index, :show, :edit, :update, :destroy] do

上記は、タスクに関するアクションを定義している。
「タスクのアクションはこれですよ、以下をルーテイングしてね」
「タスクリソースに対してどのアクションを使用するか」を指定してる。

do ... end 部分

do ... end の中で、タスクに紐づくいいねとコメントのルーティングを定義。
「タスクのルーティングの中で、いいねとコメントのURLを作成しますよ。いいねとコメントはクリエイトと削除のアクションだけ使用するのでルーティングしてね…」ということを表している。
tasks/:task_id/favorites というURLで、いいねの作成・削除を行う。)

resourceを単数で書くか、複数で書くか問題

resource :favorite, only: [:create, :destroy] 部分

なぜresource(単数形)で書くの?
単数形にすると、「/:id」がURLに含まれなくなる。

複数形だと…

resources :favorite, only: [:create, :destroy]

下記のいいねボタンを押そうとすると…

「/tasks/2/favorite/2」のURLにアクセスし、ルーティングエラーとなる。

単数形にすれば、favoriteの:id部分(favorite/2)がURLから消えて
投稿詳細ページ(/books/2)にリダイレクトする。(いいねだけされてページ移動しない)

ここでもまとめた!
https://zenn.dev/eliri/articles/36ab914266cb36


コントローラ

class Public::FavoritesController < ApplicationController
    def create
        task = Task.find(params[:task_id])
        favorie = current.user.favorites.new(task_id: task.id)
        favorite.save
        redirect_to task_path(task)
    end
end

処理の流れ

①タスクの取得(task = Task.find(params[:task_id])部分)

task = Task.find(params[:task_id])
  • params[:task_id]で、リクエストURLに含まれる task_id を取得。
  • Task.find(params[:task_id]) で、そのIDに対応するタスクをデータベースから取得する。

例えば、URLが /tasks/5/favorites だとすると、params[:task_id] には 5 が格納され、Task.find(5) でIDが5のタスクを取得する。


②いいねを作成(favorie = current.user.favorites.new(task_id: task.id)部分)

favorie = current.user.favorites.new(task_id: task.id)

current_user.favorites.new(task_id: task.id) で、ログインユーザが新しい「いいね」オブジェクトを作成する。それを変数「favorie」に代入。

(task_id: task.id) 部分

いいね(favorite)を作成する際に、どのタスクに紐づけるかを指定している。
Rubyのハッシュの記法を使用している。

task_id: task.id

上記ハッシュをnewメソッドに渡すことで、新しいfavoriteオブジェクトを作成したら、task_idtask.id をセットする。

  1. task = Task.find(params[:task_id])
  • URLから task_id を取得(例: /tasks/5/favorites の場合、params[:task_id] == 5)
  • Task.find(5) で、IDが 5 のタスクを取得
  • task.id は 5
  1. current_user.favorites.new(task_id: task.id)
  • current_user.favorites.new(...) → ログインユーザーのいいねを新規作成
  • task.id → 1で取得したタスクID。中身は「5」。
  • task_id → favorites テーブルのカラム名。今回作成した新しいfavoriteオブジェクトのtask_idに、task.id(5)を紐づけている。

favorites テーブル(いいね)

id user_id task_id created_at updated_at
1 2 5 2025-02-02 2025-02-02
  • user_id: 2ユーザーID 2の人が
  • task_id: 5タスクID 5にいいねをした

Discussion