##未ログイン者がURLで編集ページを直打ちされてもトップページへ戻る
##未出品者以外がURLで編集ページを直打ちされてもトップページへ戻る
この条件分岐がどうしてもわからなくて滅茶苦茶時間が掛かったので記録しておきます。
#該当箇所のみ
class ItemsController < ApplicationController
before_action :authenticate_user!, only: [:edit, :update, :destroy] # 未ログインユーザーはログインページにリダイレクト
before_action :set_item, only: [:edit, :update, :show]
before_action :move_to_index, only: [:edit, :update, :destroy]
def set_item
@item = Item.find(params[:id])
end
def move_to_index
# ログイン済みでも出品者でない場合はトップページにリダイレクト
redirect_to root_path unless current_user == @item.user
end
before_action :set_item, only: [:edit, :update, :show]
は、指定されたアクション(edit, update, show)
が実行される前に、set_itemメソッドを呼び出すように設定しています。set_itemは、そのアクションで使用する商品情報をデータベースから取得して設定するためのメソッドです。
具体的な動作
before_action :set_item, only: [:edit, :update, :show]
この行により、edit, update, show
のアクションが実行される前に必ずset_item
が呼び出され、@item変数に商品のデータが入ります。
set_item
メソッドの内容
def set_item
@item = Item.find(params[:id])
end
Item.find(params[:id])
は、params[:id]
に基づいて、データベースから特定のItem(商品)レコードを検索します。
例えば、URLが/items/15/edit
であれば、params[:id]
には15が入り、データベースでIDが15のItemが検索されます。
見つかった商品が@itemに代入され、その後のアクション内(edit, update, show)
で使えるようになります。
メリット
before_action :set_item
を使うことで、同じ商品取得コード(@item = Item.find(params[:id]))
をアクションごとに書く必要がなくなり、コードがすっきりして保守もしやすくなります。