LoginSignup
1
0

form_withのlocal:trueに関して

Last updated at Posted at 2024-03-01

はじめに

スクールの課題で、タスク管理アプリを作成しているときに、バリデーションが反映されない事象がありました。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コンソールでの要素が入っているかの確認。

2024-02-27 16.30の画像.jpeg

バリデーションの設定自体はうまく行っていそう。
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リクエストになり、ページ全体が返ってきてページがリロードされ、エラーメッセージも表示されるようになりました。

2024-02-27 16.32の画像.jpeg

参考文献

https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc
https://railsguides.jp/form_helpers.html

1
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
1
0