Rails validate collection_select не отображает ошибку - PullRequest
1 голос
/ 30 октября 2019

У меня простое отношение 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. Я ценю любую помощь в решении этой проблемы!

...