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?

More than 1 year has passed since last update.

Rails 7でバリデーションエラーが表示されるようにした

Last updated at Posted at 2023-05-30

はじめに

Rails学習のために入力フォームに対して無記入、または140字を超えた入力をするとエラーメッセージを表示させる機能を作っていたが、お手本通りにやっても、renderで返っては来るがエラーメッセージは表示されない。
ということが起こったので、解決に至った対処法を残しておく。

環境

Ruby 3.2.1
Railes 7.0.5

お手本(controller.rb)
  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      render :edit
    end
  end

対処法

お手本コードのrender ("posts/edit")のあとに、status: :unprocessable_entityを追記する。

追記後のコード(controller.rb)
  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      render :edit, status: :unprocessable_entity
    end
  end

これで無事にエラーコードが表示されるようになった。

なんで表示されるようになった?

参考にさせてもらったこちらによると、

status: :unprocessable_entityは、HTTPステータス=422を返しますという意味
422はサーバ側がリクエストを理解しているのに, ユーザ側の問題で処理できないケース
すなわちRailsでは, バリデーションエラーのときに返却するコード

Rails7ではフロントエンド技術としてTurboが標準でインストールされ, サーバ側にPOSTリクエストが行われた場合, Turboは新しいビューに303リダイレクトされることを想定しています。

つまり、なにも指定しなければ303リダイレクトされてしまうので、エラーメッセージを表示させたい場合は422を返しますと明示的に宣言する必要がある。

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?