概要
controllerでデータの追加処理を行った際、成功した場合と失敗した場合で処理を分けました。失敗した場合は render
で任意のテンプレートを呼び出し、フォームにエラーメッセージを表示させる処理をします。
しかし、フォームのエラーメッセージが表示されないという事態に陥ったのでその解決方法をご紹介します。
結論
render :new, status: :unprocessable_entity
status
オプションに :unprocessable_entity
を指定します。
status: :unprocessable_entityとは
status: :unprocessable_entity
はクライアントに送るHTTPステータスコードの一つです。このオプションを指定することで、 422 Unprocessable Entity
というステータスコードをクライアント側に送ります。
422 Unprocessable Entity
は、データの内容が間違っている場合のエラーです。クライアントのリクエスト形式が正しくても、サーバーが処理できない場合に発生します。
renderは200 OKステータスコードが返される
登録に失敗した場合は大抵 newなどのテンプレートを呼び出します。この時 render
で呼び出すことがほとんどだと思いますが、 render
は 200 OK
というステータスコードが返されます。
明示的に status: :unprocessable_entity
を指定することで、エラーであることを伝えることができます。
ブラウザは422ステータスコードの時はエラーメッセージを表示する
ブラウザは返されたステータスコードが200の時は正常に処理されたと理解し、エラーメッセージを表示しません。一方、422の時には処理できなかったと判断し、エラーメッセージを表示します。
処理を切り分けて render
でテンプレートを呼び出しても、エラーメッセージが表示されないのはここに原因があります。
まとめ
render
でエラーメッセージを表示させたい場合には、 status: :unprocessable_entity
オプションを追加しましょう。
こちらの記事にお世話になりました。
エラーメッセージを出力させる際に”status::unprocessable_entity”が必要な理由https://qiita.com/soraa24926/items/b169d9807124e69158ad
コメント