【Rails】renderでエラーメッセージを表示させるにはstatus: :unprocessable_entityをつける

RubyOnRails

概要

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 で呼び出すことがほとんどだと思いますが、 render200 OK というステータスコードが返されます。

明示的に status: :unprocessable_entity を指定することで、エラーであることを伝えることができます。

ブラウザは422ステータスコードの時はエラーメッセージを表示する

ブラウザは返されたステータスコードが200の時は正常に処理されたと理解し、エラーメッセージを表示しません。一方、422の時には処理できなかったと判断し、エラーメッセージを表示します。

処理を切り分けて render でテンプレートを呼び出しても、エラーメッセージが表示されないのはここに原因があります。

まとめ

render でエラーメッセージを表示させたい場合には、 status: :unprocessable_entity オプションを追加しましょう。

こちらの記事にお世話になりました。

エラーメッセージを出力させる際に”status::unprocessable_entity”が必要な理由https://qiita.com/soraa24926/items/b169d9807124e69158ad

コメント

タイトルとURLをコピーしました