У меня простое отношение has_many :through
, и я хочу проверить, что при создании Course
выбрано не менее двух связанных записей. Student
s зарегистрированы в Course
через EnrollmentAssignment
ассоциацию. Я хочу выбрать учеников для зачисления в форму Course
и подтвердить, что выбрано как минимум 2 ученика. Я использую простую форму , которая обрабатывает фактический HTML / CSS для ошибок проверки, так что это может быть что-то для настройки в этой библиотеке / конфигурации, или это может быть ошибка в библиотеке.
Курс
class Course < ApplicationRecord
has_many :enrollment_assignments,
class_name: 'EnrollmentAssignment',
foreign_key: 'course_id'
has_many :students,
through: :enrollment_assignments
validate :students_selected
def students_selected
self.errors.add(:student_ids, "select at least 2 students") if student_ids.size < 2
end
end
Зачисление на прием
class EnrollmentAssignment < ApplicationRecord
belongs_to :course
belongs_to :student
end
Студент
class Student < ApplicationRecord
has_many :enrollment_assignments,
class_name: 'EnrollmentAssignment',
foreign_key: 'student_id'
has_many :courses,
through: :enrollment_assignments
end
А теперь поле формы HTML (тонкая разметка, но вы поняли):
= f.collection_select(:student_ids, students, :id, :name,
{include_blank: false, :include_hidden => false, :selected => @course.students.map(&:id)},
{:multiple => true})
Я хочу подтвердить, что выбрано как минимум 2 студента. Пользовательская проверка работает, потому что я получаю сообщение об ошибке при проверке объекта на сбой проверки:
#<ActiveModel::Errors:0x007fe70e058500
@base=
#<Course:0x007fe70c0813f8
id: nil,
name: "Whatever",
created_at: nil,
updated_at: nil>,
@details=
{:student_ids=>[{:error=>"select at least 2 students"}]},
@messages=
{:student_ids=>["select at least 2 students"]}>
Однако ошибка фактически не отображается в форме. Форма выбора HTML выглядит следующим образом:
<select multiple="" name="course[student_ids][]" id="course_student_ids">
<option value="1">Student 1</option>
<option value="2">Student 2</option>
</select>
Правильный неверный ввод HTML выглядит следующим образом:
<div class="form-group string required course_name form-group-invalid">
<label class="form-control-label string required" for="course_name">Name <abbr title="required">*</abbr></label>
<input class="form-control is-invalid string required" type="text" value="" name="course[name]" id="course_name">
<div class="invalid-feedback">Name can't be blank</div>
</div>
Параметры проходят хорошо (даже в сильных параметрах), простоформа не будет отображать ошибку. В других полях валидации показаны без проблем, просто это поле выбора не будет отображаться должным образом. Я полагаю, что это как-то связано с тем, что это collection_select
. Я ценю любую помощь в решении этой проблемы!