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

【Rails】furimaアプリ 商品情報編集機能 #1

Posted at

実装概要

画像を含む商品の情報を編集する機能を実装

ルーティングの設定

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_actionset_itemを先に実行させることによってcorrect_userメソッドに@item = Item.find(params[:id])が渡されるようになるので省略することができる

LGTMいただいてので次回は商品削除機能の実装に取り組んでいきます!!

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