掲示板の編集と削除機能

掲示板の編集と削除機能


[掲示板の編集機能]
掲示板の編集機能を実装するのにコントローラに以下のように記述する

[app/controllers/boards_controller.rb]

def edit
    @board = current_user.boards.find(params[:id])
end

def update
    @board = current_user.boards.find(params[:id])
    if @board.update(board_params)
      redirect_to @board, success: (t '.success')
    else
      flash.now[:danger] = (t '.fail')
      render 'edit'
    end
end


※ポイント
コントローラに以下のように記述しない!!

[app/controllers/boards_controller.rb]

def edit
  @board = Board.find(params[:id])
end

#この記載だとログイン状態で、URL入力時にURLのID部分を他の人の掲示板のIDに変えてアクセスすると、アクセスできてしまい編集できてしまう為。(他の人の掲示板情報を取得するshowアクションなどは、Board.find(params[:id])のようにして良いが、editアクションやupdateアクション、destroyアクションなどは、本人じゃないと操作できないようにした方が良い為、current_user.boards.find(params[:id])のように記載する。)


[掲示板の削除機能]

[app/controllers/boards_controller.rb]

def destroy
    @board = current_user.boards.find(params[:id])
    @board.destroy!
    redirect_to boards_url, success: (t '.success')
end


※ポイント
[destroy]メソッドではなく、[destroy!]メソッドを使う。
[save]と[save!]、[create]と[create!]、[update]と[update!]、[destroy]と[destroy!]の違いは、処理が失敗した時の挙動。
[save],[create],[update],[destroy]:バリデーションエラーで処理に失敗した時に[false]を返す。(処理が失敗する可能性が想定でき、失敗した場合に処理を変えたい場合に使う。)
[save!],[create!],[update!],[destroy!]:バリデーションエラーで処理に失敗した時に例外を発生させる。(処理が必ず成功する事が想定でき、万が一失敗したらそこで処理を中断したい場合に使う。)
「!」を付けるメソッドにするかどうかは、一見そこまで重要ではないように思うが非常に重要になってくる。掲示板の作成時などは、バリデーションに[presence: true]制約などをしていた場合に、空欄で掲示板の作成ボタンを押されることが予想できるが、掲示板を削除する際は、「コメントが付いている掲示板は削除させない」のような特別な場合を除いては、失敗することが予想されない為、万が一失敗するような場合は処理をそこで中断させるべきです。