rails模型验证跳过和订单

时间:2010-06-28 08:06:46

标签: ruby-on-rails

有什么方法可以让我的rails模型验证按特定顺序执行,如果不满足以前的验证,则跳过某些验证。

例如:我有2个输入字段start_date和end_date。我的模型中有两个验证方法

其中一个检查日期是否小于“12/31 /#{Date.today.year + 1}”

 def end_date_in_range
    if self.end_date
      errors.add_to_base("Enter a date before #{Date.today.year + 1}") if self.end_date > Date.parse("12/31/#{Date.today.year + 1}")
    end
 end

我有另一个验证,它会逐步完成从开始日期到结束日期的日期

  def
    (self.start_date.to_date .. self.end_date.to_date).inject(0) { |sum, n|  ... }
  end

现在,如果用户输入end_date,如12/31/20101,则第一次验证失败,但看起来要么继续检查下一次验证,要么先执行第二次验证,并且在两种情况下都挂起我的应用程序请求。我希望它检查第一次验证并将错误返回给用户,而不是逐步完成第二次验证中的日期。

感谢, 灰

2 个答案:

答案 0 :(得分:1)

使用elsif

 def end_date_in_range
    if self.end_date
      errors.add_to_base("Enter a date before #{Date.today.year + 1}") if self.end_date > Date.parse("12/31/#{Date.today.year + 1}")
    elsif  #second validation test

    end
 end

答案 1 :(得分:0)

在这种情况下可能没有必要(Salil的答案对于这个简单的情况更好),但如果您有几个验证取决于一组条件,您还可以在验证中添加“if”子句,例如:

validates :first_validation
validates :second_validation, :if => :check_conds_now
validates :third_validation,  :if => :check_conds_now

# should return true/false
def check_conds_now
   (cond1 && cond2 && ! cond3)
end