0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails7:フォーム送信後のエラーメッセージの表示ができない(Error: Form responses must redirect to another location)

Posted at

環境
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技術入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?