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

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

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

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

Ruby on Rails

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

解決済

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

no1knows
no1knows

総合スコア3243

Ruby

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

Ruby on Rails

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

1回答

0リアクション

0クリップ

231閲覧

投稿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

# モデル class Schedule < ApplicationRecord has_many :schedule_users, dependent: :destroy has_many :users, through: :schedule_users end class User < ApplicationRecord has_many :schedule_users has_many :schedules, through: :schedule_users end class ScheduleUser < ApplicationRecord belongs_to :schedule belongs_to :user validates :user_id, comparison: { greater_than: 2 } end

Ruby

# views > schedules > _form.html.erb <%= form_with(model: schedule) do |form| %> <% 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> <% end %> <%= form.datetime_select :start_datetime %> <%= form.datetime_select :end_datetime %> <%= form.collection_check_boxes :user_ids, User.all, :id, :name %> <%= form.submit %> <% 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 %>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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