質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

789閲覧

多対多で、collection_check_boxesを利用して中間テーブルのバリデーションエラーを表示したい

no1knows

総合スコア3365

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/08/26 05:45

編集2022/09/06 04:03

実現したいこと

多対多で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 %>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この構成で 中間テーブルのvalidationというのが必要ですか?
validates :user_id, comparison: { greater_than: 2 }
これは 日本語でいうとどういうエラーを想定してます?
user id が 3以上 というのがどういう意味があるのでしょう。
id 1,2 は排除する?

中間テーブルに 単に2つのmodelを関係つける という意味を持たせるだけでしたら validationの定義は不要です。
belongs_to :schedule
belongs_to :user
が必要なvlidationを定義してくれます。
それが Schedule users is invalid です。
おそらく実在しないUser id が渡ったのだと思いますが、controllerがないのでそれ以上は言えません。

schedule_users.errors.any?
はだめですね。errors は モデルのインスタンスのmethodです。schedule_users はモデルの集合ですから、これにはありません。
schedule_users を一つづつ errors.any?してください。
それと、このviewでは schedule_users ってどこで定義してます?

投稿2022/08/26 12:03

winterboum

総合スコア23331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

no1knows

2022/08/28 01:49

validationの内容は本筋と外れるので、簡単なものを用意しただけで、実際は、カスタムバリデーションを作成する予定でした。混乱させてしまい申し訳ありません。 > それと、このviewでは schedule_users ってどこで定義してます? ここがよくわかっていないのですが、schedule_usersを定義するって、この場合、どのようにして定義すればよいのでしょうか?
no1knows

2022/09/06 01:32

すいません。きちんと理解できていませんでした。下記のように定義するのでは間違っているのでしょうか? def new @schedule = Schedule.new @schedule.schedule_users.build end
winterboum

2022/09/06 01:44

new でしたらそうですね
winterboum

2022/09/06 02:02

ただし、それをどうviewに渡すか、というのが落ちてませんか?
no1knows

2022/09/06 04:02

色々と導いていただきありがとうございます!できました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問