Подтвердить что ты не робот

Как проверить идентификатор связанной модели?

У меня есть студент и модель курса. Студент принадлежит к курсу, и курс имеет много студентов.

class Student < ActiveRecord::Base
  attr_accessible :course_id, :name, :password, :status, :studentID, :year
  belongs_to :course

  validates :name, :password, :status, :studentID, :year, :presence =>true
  validates_associated :course
end

class Course < ActiveRecord::Base
  attr_accessible :courseCode, :courseName, :courseYr
  validates :courseCode,:courseName,:courseYr, :presence => true
  validates :courseCode,:courseYr, :uniqueness=>{:message=>"Cannot repeat the code"}

  has_many :students 
end

В форме, используемой для создания записи студента, я позволяю пользователю вводить идентификатор курса.

<div class="field">
  <%= f.label :course_id %><br />
  <%= f.text_field :course_id %>
</div>

Но я не знаю, как подтвердить ввод course_id пользователем. Проверка модели студента не приведет к ошибке, даже если я набираю идентификатор курса, который не существует. Как мне его показать, чтобы показать ошибку?

4b9b3361

Ответ 1

Вы должны посмотреть на создание настраиваемого метода проверки:

class Student < ActiveRecord::Base
  validates :course_id, presence: true, numericality: { only_integer: true }
  ...
  validate :validate_course_id

private

  def validate_course_id
    errors.add(:course_id, "is invalid") unless Course.exists?(self.course_id)
  end
end

Во-первых, ваша модель будет гарантировать, что course_id является действительным целым числом, а затем ваша пользовательская проверка будет гарантировать, что курс существует в базе данных.

Ответ 2

Вы можете просто выполнить специальный метод проверки, который проверяет правильность вашего идентификатора курса:

# course.rb
validates :course_id_is_valid

def course_id_is_valid
  if #course id isn't valid
    errors.add(:course_id, "is invalid")
  end
end

В качестве альтернативы, если список курсов представляет собой дискретный список, вы можете использовать опцию: in при проверке:

# course.rb
validates :course_id, :inclusion => { :in => list_of_courses, :message => "%{value} is not a course id" }

Есть больше вариантов. Оба эти примера взяты из документов Rails:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods

Ответ 3

Вы можете проверить наличие ассоциации курса. Итак, если не существует, допустимо? будет ложным.

Ваш класс должен быть:

class Student < ActiveRecord::Base
  attr_accessible :course_id, :name, :password, :status, :studentID, :year
  belongs_to :course

  validates :course, :name, :password, :status, :studentID, :year, presence: true
end

Различия в проверке внешнего ключа и самой ассоциации объясняются на этом post.

Если вам не нужно проверять наличие курса, вы можете сделать это:

validates :course, presence: true, if: -> {course_id.present?}