1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

条件分岐 【備忘録】

Posted at

##未ログイン者がURLで編集ページを直打ちされてもトップページへ戻る
##未出品者以外がURLで編集ページを直打ちされてもトップページへ戻る

この条件分岐がどうしてもわからなくて滅茶苦茶時間が掛かったので記録しておきます。

app/controllers/items_controller.rb
#該当箇所のみ
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]))をアクションごとに書く必要がなくなり、コードがすっきりして保守もしやすくなります。

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?