はじめに
スクールの課題で、タスク管理アプリを作成しているときに、バリデーションが反映されない事象がありました。Railsのコンソールで、確認するとたしかにバリデーションのメッセージは出るのに、実際にブラウザ画面では出ませんでした。解決したのですが、備忘録として共有させていただきます。修正や追加等ありましたら、コメントいただけるとありがたいです。
環境
・MacBookAir 13インチ M1(2020)
・OS:Sonoma 14.3
・メモリ:16GB
・Rails: version 6.1.7.6
エラーメッセージが出ない
<%= form_with(model: task) do |form| %>
<% if task.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(task.errors.count, "error") %> prohibited this task from being saved:</h2>
taskの新規登録のフォームで、バリデーションが通らなかった時にエラーメッセージをビューで表示したいと思いましたが、ブラウザで見てみるとエラーメッセージが表示されませんでした。
やったこと
Railsコンソールでの要素が入っているかの確認。
バリデーションの設定自体はうまく行っていそう。
errorsやfull_messagesにもデータが入っていることを確認しました。
binding.irbを使っての他要素の確認も行いました。
tasks/controllersの確認も行いましたが、問題なさそうでした。
結論
local: true
を追記。
<%= form_with(model: task, local:true) do |form| %>
<% if task.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(task.errors.count, "error") %> prohibited this task from being saved:</h2>
local: true
の設定がない場合、HTMLでdata-remote="true"の記載が追加され、Ajax通信(JavaScriptによる非同期処理)が行われるので、必要な箇所だけページが更新され、その他の箇所はそのままになるという事でした。そのため、エラーメッセージのHTML部分が加えられなかったと考えられました。
local: true
と引数を渡す事で、これが通常のHTTPリクエストになり、ページ全体が返ってきてページがリロードされ、エラーメッセージも表示されるようになりました。
参考文献
https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc
https://railsguides.jp/form_helpers.html