実現したいこと
多対多でcollection_check_boxesを利用して中間テーブルに保存する際に、中間テーブルのバリデーションエラーを表示したいです。
前提
ScheduleモデルとUserモデルがScheduleUserモデルで紐付いています。
/schedules/newページで下記コードを実行すると、デフォルトのエラーメッセージmust be greater than %{count}
ではなく、
1 error prohibited this schedule from being saved: Schedule users is invalid
が表示されてしまいます。
該当のソースコード
Ruby
1# モデル 2class Schedule < ApplicationRecord 3 has_many :schedule_users, dependent: :destroy 4 has_many :users, through: :schedule_users 5end 6 7class User < ApplicationRecord 8 has_many :schedule_users 9 has_many :schedules, through: :schedule_users 10end 11 12class ScheduleUser < ApplicationRecord 13 belongs_to :schedule 14 belongs_to :user 15 16 validates :user_id, comparison: { greater_than: 2 } 17end
Ruby
1# views > schedules > _form.html.erb 2<%= form_with(model: schedule) do |form| %> 3 <% if schedule.errors.any? %> 4 <div style="color: red"> 5 <h2><%= pluralize(schedule.errors.count, "error") %> prohibited this schedule from being saved:</h2> 6 7 <ul> 8 <% schedule.errors.each do |error| %> 9 <li><%= error.full_message %></li> 10 <% end %> 11 </ul> 12 </div> 13 <% end %> 14 15 <%= form.datetime_select :start_datetime %> 16 <%= form.datetime_select :end_datetime %> 17 <%= form.collection_check_boxes :user_ids, User.all, :id, :name %> 18 19 <%= form.submit %> 20 21<% end %>
試したこと
Viewで<% if schedule.errors.any? %>.....
を真似して、
<% schedule_users.errors.any? %>
を作ればよいかと思ったのですが、エラーが出てしまいました。
undefined local variable or method `schedule_users' for #<ActionView::Base:0x0000000003f020> '.freeze; if schedule_users.errors.any?
補足情報(FW/ツールのバージョンなど)
Rails 7.0.3.1
解決したコードの追記
<% if schedule.errors.any? %> <div style="color: red"> <h2><%= pluralize(schedule.errors.count, "error") %> prohibited this schedule from being saved:</h2> <ul> <% schedule.errors.each do |error| %> <li><%= error.full_message %></li> <% end %> </ul> </div> <% if schedule.schedule_users.any? %> <% schedule.schedule_users.size.times do |num| %> <div style="color: red"> <ul> <% schedule.schedule_users[num].errors.each do |error| %> <li><%= error.full_message %></li> <% end %> </ul> </div> <% end %> <% end %> <% end %>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/28 01:49
2022/08/28 02:12
2022/09/06 01:32
2022/09/06 01:44
2022/09/06 02:02
2022/09/06 04:02