⭐️掲示板の編集、削除機能の実装

・Userモデルに記載していた

def own?(object)
  id == object.user_id
end

を利用して、自分が作成した掲示板のみ、編集、削除ボタンを表示させるように実装。

・app/views/boards/show
Image from Gyazo

・app/views/boards/_board.html.erb
Image from Gyazo

※重要

boards_controller.rb

# Bad
  @board = Board.find(params[:id])
  ※ この記載では、URL入力時のIDを変えると自分以外が作成した掲示板を対象にできてしまう。
    このアプリは他の人の掲示板を見られる仕様のため、showアクションではBoardから取得させても問題ない。
    しかし、editやupdate, destroyアクションでは、他人の作成した掲示板を変更できないように実装。

# Good
  @board = current_user.boards.find(params[:id])
  ※ current_user.boardsによって、対象のユーザーに関連する掲示板の集合が取得できる。
def destroy
    @board.destroy!

!を使っている理由は、削除処理は「必ず成功するもの」だから。
save save! は、処理が失敗したときの挙動が違います。 前者はfalse を返し、後者は例外を返します。

例えば、掲示板作成でタイトルを入力漏れし、falseが帰ってきたら、エラー表示箇所を訂正してまた作成を試みます。掲示板作成は「失敗する可能性がある」処理です。

一方、削除の処理は失敗する余地がない処理です。この処理が失敗したときは、意図的に処理を止めてデバッグが必要になります。

🟢総括

今回の課題で、

・モデルにメソッドを定義することで条件変更時にモデルメソッド1箇所の変更で済む保守性が良くな流ことが分かった。

・破壊的メソッド!の使い方をよく理解できた!🔥