我有一个学生和一个课程模型。学生属于课程,课程有很多学生。
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 不存在也是如此。如何让它显示错误?
您应该考虑创建自定义验证方法:
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
是有效的整数,然后您的自定义验证将确保课程存在于数据库中。
您可以验证课程关联的是否存在。那么,如果不存在,有效吗?将是假的。
您的班级应该是:
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?}
您可以执行自定义验证方法来检查课程 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