2010-06-28 56 views
4

有沒有什麼辦法可以讓我的軌道模型驗證按特定順序執行,如果以前的驗證不滿足,可以跳過某些驗證。軌道模型驗證跳過和訂單

例如:我有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 

我還有一個驗證哪些步驟通過日期從開始日期到結束日期如果用戶輸入像12/31/20101的END_DATE現在

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

,失敗的第一次驗證,但看起來它要麼繼續檢查下一個驗證或驗證第二首先執行,並在這兩種情況下掛起我的應用程序,而進程這個請求。我希望它檢查第一個驗證並將錯誤返回給用戶,而不是逐步通過第二次驗證中的日期。

感謝, 灰

回答

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 
0

大概在這種情況下沒有必要(薩里爾的答案適用於這種簡單的情況下更好),但如果你有幾個驗證是偶然在一個單一一套條件,你還可以添加一個「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