はじめに
Rails学習のために入力フォームに対して無記入、または140字を超えた入力をするとエラーメッセージを表示させる機能を作っていたが、お手本通りにやっても、render
で返っては来るがエラーメッセージは表示されない。
ということが起こったので、解決に至った対処法を残しておく。
環境
Ruby 3.2.1
Railes 7.0.5
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
を追記する。
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を返しますと明示的に宣言する必要がある。