13

我有一个学生和一个课程模型。学生属于课程,课程有很多学生。

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

在用于创建学生记录的表单中,我让用户输入课程 ID。

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

但我不知道如何验证course_id用户的输入。即使我键入不存在的课程 ID,学生模型验证也不会产生错误。我如何让它显示错误?

4

3 回答 3

18

您应该考虑创建自定义验证方法:

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是一个有效的整数,然后您的自定义验证将确保该课程存在于数据库中。

于 2012-09-16T22:44:38.617 回答
4

您可以验证课程关联的存在。那么,如果不存在,有效吗?将是错误的。

你的班级应该是:

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

在这篇文章中解释了验证外键和关联本身的区别。

如果您当然不需要验证存在,您可以执行此解决方法:

validates :course, presence: true, if: -> {course_id.present?}
于 2014-09-12T12:18:02.697 回答
3

您可以只执行一个自定义验证方法来检查您的课程 ID 的有效性:

# 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

于 2012-09-16T22:41:20.543 回答