📧
【Rails7.0】バリデーションのエラーメッセージが表示されない時の解決法
概要
Rails7.0で進めていると、バリデーションのメッセが出ないという障害にぶつかった。
今回はその原因と解決法をまとめたので、ここに記述する。
問題
- Ruby 3.1.1
- Rails 7.0.2.3
…上記の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されなかった。
原因
Rails7.0からデフォルトでTurbo
が導入されており、バリデーションのエラーメッセージを表示させるためには下記の記述を追加する必要があるようだ
users_controller.rb
(省略)
def create
@user = User.new(params.require(:user).permit(:name, :email, :age, :introduction))
if @user.save
flash[:notice] = "ユーザーを新規登録しました"
redirect_to :users
else
render :new, status: :unprocessable_entity #こちらを追記しよう
end
end
(省略)
Turboとは
Turbo
はHotwire
の中心となる要素だ。
Turbo
はTypeScriptで書かれたサーバー側言語に依存しないフレームワークだが、サーバー側言語との接続にはアダプタを書く必要がある。
Railsで使う場合はすでに用意されていて、便利なヘルパーを使うことができる。このヘルパーを実装するのがgem "turbo-rails"
だ。
Hotwireとは
JavaScriptを極力書かずにモダンなアプリケーションを作成するためのフレームワーク。Hotwire
自体はライブラリではなく、実態は複数のライブラリを統合したもの。
解決法
createアクションに:new
に加えて、下記のstatus: :unprocessable_entity
を追記しよう
render :new, status: :unprocessable_entity #こちらを追記しよう
参考
まとめ
- Rails7.0の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されない原因は、デフォルトで
Turbo
が導入されているから - 解決法は、createアクションに
status: :unprocessable_entity
を追記すること
Discussion