Rails のメソッドを実行してエラーが発生した時、
false を返すものと、
例外を発生させるものとの2種類が用意されている事があります。
e.g.
save は false、save! は例外。
例外を吐くメソッドは、メソッド名の末尾に!が付いている事が多いです。
(破壊的メソッドの!もあるので注意)
例外が発生すると、WEBの動作が止まってしまいます。
Scaffold が生成する destroy アクションのデフォルトは destroy! で例外を吐きます。
が、
ユーザーが正常な操作をした時でも destroy が失敗する可能性があるのなら、
例外で止めるのは得策ではありません。
@book.destroy! ではなく、
if @book.destroy
# 成功時の処理
else
# 失敗時の処理
end
で分けるほうが好ましいです。
Rails8 は、デフォルトで Turbo On です。
(Turbo については Turbo Stream で説明します。)
エラーが発生した時に、
format.html { render :edit }
しただけだと、実際の画面切り替えが起こりません。(見た目が変わりません)
format.html { render :edit, status: :unprocessable_entity }
と status を追加します。
unprocessable_entity は HTTP Status Code 422 で、
このコードを渡すことで全画面の書き換えが行われます。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/d401cdc