掲示板の編集と削除機能の実装(ルーティングとコントローラー)
<実現したいこと>
♡編集機能と削除機能の追加
♡掲示板を作成した本人のみが、編集と削除をできるようにしたい
<手順>
♡config/routes.rbに編集と削除機能の定義を追加する
♡app/controllers/boards.controller.rbに定義を追加する
①config/routes.rbに編集と削除機能の定義を追加する
resourcesで一括管理できるアクションindex・show・new・create・edit・update・destroy7つあり、一つずつ定義した場合以下のようになる。
Rails.application.routes.draw do
get 'boards' => 'boards#index'
get 'boards/:id' => 'boards#show'
get 'boards/new' => 'boards#new'
post 'boards' => 'boards#create'
get 'boards/:id/edit' => 'boards#edit'
patch 'boards/:id' => 'boards#update'
delete 'boards/:id' => 'boards#destroy'
end
☆resouceの場合…
show・new・create・edit・update・destroyになり、単数なのでindexがなくなり、識別する必要がないためidも生成されない。
今回の編集と削除機能の実装により、boardsは全てのアクションを用いることになったため、config/routes.rbは以下のようになる。
resources :boards do
resources :comments, only: %i[create], shallow: true
end
②app/controllers/boards.controller.rbに定義を追加する
before_action :set_board, only: %i[edit update destroy]
(省略)
def edit; end
def update
if @board.update(board_params)
redirect_to @board, success: t('defaults.updated', item: Board.model_name.human)
else
flash.now[:danger] = t('defaults.no_updated', item: Board.model_name.human)
render :edit
end
end
def destroy
@board.destroy!
redirect_to boards_path, success: t('defaults.deleted', item: Board.model_name.human)
end
private
def set_board
@board = current_user.boards.find(params[:id])
end
☆current_user.boards.find(params[:id])
とすることで、実際に掲示板を作成したユーザーのみがデータを取得することができるようになる。
☆!を付けるか否かは例外を発生させるかどうかで異なる
!のを付ける場合→バリデーションに引っかかると、ActiveRecord::RecordInvalid例外が発生する。
!を付けない前者の場合→falseが返ってくる。
⇨例えば、saveを用いてDBに保存できたかどうかによって処理を分岐したい場合、失敗することも想定しており、falseが返ってきた場合の処理を決めておく。
detroyの場合、失敗することが想定されないため、例外を発生させたいため、destroy!を用いる。
☆最後の
def set_board
@board = current_user.boards.find(params[:id])
end
は、edit・update・destroyに共通しているコードなので、最初に
before_action :set_board, only: %i[edit update destroy]
とbefore_actionにまとめて記載することができる。