実装概要
画像を含む商品の情報を編集する機能を実装
ルーティングの設定
config/routes.rb
# 中略
resources :items, only: [:index, :new, :create, :show, :edit]
editアクションをコントローラーに定義
app/controllers/items_controller.rb
# 中略
def edit
@item = Item.find(params[:id])
end
editページの編集
new.html.erb
ファイルと同様のコードを記述(コード内容は割愛)
updateアクションのルーティングを設定
config/routes.rb
resources :items, only: [:index, :new, :create, :show, :edit, :update]
updateアクションをコントローラーに定義
app/controllers/items_controller.rb
def update
item = Item.find(params[:id])
item.update(item_params)
redirect_to item_path(item.id)
end
edit.html.erb
ページに遷移した場合「未ログインユーザー:ログインページ」「出品者以外のログインユーザー:トップページ」へ遷移するようにコントローラー内に定義
app/controllers/items_controller.rb
before_action :authenticate_user!, only: [:new, :create, :edit, :update]
before_action :correct_user, only: [:edit, :update]
# 中略
private
def correct_user
@item = Item.find(params[:id])
return if current_user.id == @item.user.id
redirect_to root_path
end
privateメソッド内にcorrect_user
メソッドを定義(ログインユーザー=出品者となっていない場合はトップページへ遷移)しbefore_action
でedit,updateアクションが実行される前に判別できるように設定
入力が誤っていた際エラーハンドリングができるようにupdateアクションを修正
app/controllers/items_controller.rb
def update
@item = Item.find(params[:id])
if @item.update(item_params)
redirect_to item_path(@item.id)
else
render :edit, status: :unprocessable_entity
end
end
変数item
では<%= render 'shared/error_messages', model: f.object %>
が読み込まれなかったので@item
に修正しコードを記述
同じコードをメソッドとしてまとめる
@item = Item.find(params[:id])
がshow,edit,updateアクションで使用されていたので、
set_itemメソッドでまとめる
app/controllers/items_controller.rb
# 中略
before_action :set_item, only: [:edit, :show, :update]
# 中略
def show
end
def edit
end
def update
if @item.update(item_params)
redirect_to item_path(@item.id)
else
render :edit, status: :unprocessable_entity
end
end
private
def set_item
@item = Item.find(params[:id])
end
実装が完了したのでコードレビュー依頼!
リファクタリングの修正依頼あり
リファクタリング
app/controllers/items_controller.rb
before_action :set_item, only: [:edit, :show, :update]
before_action :correct_user, only: [:edit, :update]
# 中略
def correct_user
return if current_user.id == @item.user.id
redirect_to root_path
end
before_action
のset_item
を先に実行させることによってcorrect_user
メソッドに@item = Item.find(params[:id])
が渡されるようになるので省略することができる
LGTMいただいてので次回は商品削除機能の実装に取り組んでいきます!!