POST/Redirect/GETはウェブで<form>から非GETのリクエストを送信する際の定石パターンです。日本語のPRGパターンの解説としてはここが良いと思います。
<form>の非GETリクエストのレスポンスがStatus 200系だった場合はレスポンスを無視します。
<form>送信後のURLが不整合になる可能性があります。URL(document.location.href)の整合性を保ためにPOST/Redirect/GETパターンを強制しています。2 3document.location.href)に影響しないためです。 <form>送信後の通信2往復を避ける必要があり、かつURLの変更をさせない場合はTurbo Streamを使いますNext.jsのserver actionも、内部処理には多少の違いはあるものの、POST/Redirect/GETのパターンを使います。 ↩
非同期のform送信では多重送信が起きません。多重送信はPOST後の画面でリロードするとPOSTが再送信されてしまうのが原因でした。しかし非同期でPOSTをした場合はリロードしてもPOSTは再実行されませんので多重送信の心配はありません。 ↩
Turboで<form>から非GETのリクエストを送信する場合、URLを変更しません。そのためレスポンスの内容をそのまま画面に表示してしまうと、表示コンテンツの内容とURLの中身が噛み合わなくなってしまいます(例えばURLはposts/newなのに、新しく作成されたposts/1の内容が表示されてしまいます)。一方で仮にリクエストを送信後にURLを<form>のaction属性に合わせてしまうと(ブラウザのnativeの挙動)、URLはPOST用のものになります。この時点でブラウザリロードをするとGET methodでPOST用のURLにリクエストを投げてしまうので、これも不整合になります。どっちの実装も大きい課題があるため、Turboではredirectを強要する設計にしています。 ↩