saveとsave!の違いは「処理が失敗した時の挙動」に違いがある。
『処理が失敗する可能性が想定されて、失敗した場合に何かハンドリングしたい場合』 ex 「掲示板の作成フォーム」
<aside> 💡 ・「タイトル」や「内容」は必須項目ですが、未入力の状態で送信ボタンが押されることは大いに考えらます。これが『失敗する可能性が想定』される部分です。
</aside>
<aside> 💡 ・そしてその場合は「タイトルを入力してください」のようなエラーメッセージをブラウザに表示させる必要があるはずです。これが『失敗した場合に何かハンドリングしたい場合』の部分です。
</aside>
『処理が必ず成功すると想定されていて、万が一失敗したらそこで処理を中断したい場合』
ex「掲示板の削除」
「掲示板を削除する」という行為が失敗した場合、どうすればいいか?
<aside>
💡 ・destroy! と記載して、万が一処理に失敗した場合は システムエラーとして処理を中断させる。
</aside>
bords_conotroller.rb(一部抜粋)
before_action :set_board, only: %i[edit update destroy]
#共通化してかけるコードはまとめて before_action で記載。
#(今回で言うと、掲示板を取得すると言う処理が共通している。)
def destroy
@board.destroy!
redirect_to boards_path, success: t('defaults.message.deleted', item: Board.model_name.human)
end
#削除機能のような失敗することが想定されていない物には『!』をつける
#そうすることで万が一処理が失敗した場合に処理をそこで中断できる
private
def set_board
@board = current_user.boards.find(params[:id])
end
#current_user.boardsによって、対象のユーザーに関連する掲示板の集合が取得できます。
パーシャルの中でインスタンス変数を使用していないこと
理由