環境
Ruby:3.2.2
Rails:7.1.5
期待していた動作
・フォーム送信時にエラーメッセージを伴ってフォームを再び表示させる
症状
・エラーが表示されない
・コンソールに以下のメッセージが出力されていた
”Error: Form responses must redirect to another location”
推察
・フォームの送信結果は送信の成否にかかわらず他のページへリダイレクトする必要があるのではないか?
調査
https://qiita.com/wa-chan222/items/01f86da80d0d59e966d8
https://stackoverflow.com/questions/70400958/error-form-responses-must-redirect-to-another-location
調査の要約
・Turboはフォーム送信後のレスポンスで所定のステータスコードを期待している。(成功時は303,失敗時は422)。これらのステータスコードでないとTurboはうまく動作しない。
解決策
・Railsではレスポンス時に明示的にステータスコードを指定できる
・結果としてうまくエラーメッセージが表示され、期待通りの結果となった。
def create
@task = Task.new(task_params)
if @task.save
#303を返す
redirect_to @task,notice: "タスク#{@task.name}が新規作成されました",status: 303
else
#422を返す
render :new,status: 422
end
end
ステータスコードについて
・Rails はデフォルトではrenderで200,redirectで302のステータスコードを返す。そこでTurboが正常に動作するようにステータスコードを設定する必要があった。ステータスコードの意味は以下のようになっている。
302:リダイレクト。「コンテンツが一時的に移動しているのでメソッドはそのままにしてほかのURLにリクエストを送ってくれ」という指示。
303:リダイレクト。「送信結果はほかのページで表示するための場所を用意しているのでメソッドをgetリクエストにしてそちらを訪ねてくれ」という指示。
422:クライアントエラー。「400と違い、構文・リクエストのメタデータ的には問題ないがnullやバリデーションエラーなどカラムの値的・意味的な問題がある」という指示。
参考文献
・webを支える技術
・プロになるためのweb技術入門