😊

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

2025/02/02に公開

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


ルーティング

# tasksコントローラのルーティング
resources :tasks, only: [:new, :create, :index, :show, :edit, :update, :destroy] do
  resources :favorite, only: [:create, :destroy], as: "favorites"
  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で、いいねの作成・削除を行う。)


コントローラ

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