掲示板の編集と削除機能の実装(ルーティングとコントローラー)

<実現したいこと>

♡編集機能と削除機能の追加

掲示板を作成した本人のみが、編集と削除をできるようにしたい

 

<手順>

♡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にまとめて記載することができる。