如何验证关联的模型ID?

cod*_*e4j 12 ruby activerecord ruby-on-rails

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

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
Run Code Online (Sandbox Code Playgroud)

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

<div class="field">
  <%= f.label :course_id %><br />
  <%= f.text_field :course_id %>
</div>
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ers 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
Run Code Online (Sandbox Code Playgroud)

首先,您的模型将确保它course_id是一个有效的整数,然后您的自定义验证将确保该课程存在于数据库中.

  • 您可以将`presence`检测更改为:`validates:course_id,presence:true,numericality:{only_integer},除非: - > {errors.include?(:course_id)}`.如果您尝试这样做,请确保在"在线状态"检测之前进行自定义验证. (2认同)