2012-05-18 47 views
5

我正在寫在ActiveRecord的自定義驗證,這樣一個最後期限是有道理的:導軌:驗證一個日期大於另一個

validate :deadline_is_possible? 

    def deadline_is_possible? 
    if deadline > begins_at 
     errors.add(:deadline, 'must be possible') 
    end 
    end 

然而,這產生一個「NoMethodError:未定義的方法'>」近親:NilClass 」。我的事件試圖將日期變成字符串,如:

def deadline_is_possible? 
    if deadline.to_s > begins_at.to_s 
     errors.add(:deadline, 'must be possible') 
    end 
    end 

雖然它不會產生錯誤,但也不起作用。

我還宣佈其他驗證(如

def begins_at_is_date? 
    if !begins_at.is_a?(Date) 
     errors.add(:begins_at, 'must be a date') 
    end 
    end 

這項工作確定。

回答

1

這是抱怨,因爲deadline是零。打印以確認這就是問題所在。

irb(main):001:0> nil > Date.new 
NoMethodError: undefined method `>' for nil:NilClass 
2

如果其中一個日期爲零,您可能需要處理。您可以將它們設置爲在截止日期數據庫中具有默認值,或者執行如下操作:

validate :deadline_is_possible? 

    def deadline_is_possible? 
    return if [deadline.blank?, begins_at.blank?].any? 
    if deadline > begins_at 
     errors.add(:deadline, 'must be possible') 
    end 
    end 
+0

這消除了錯誤,但預期它不工作: '@ event.deadline = @ event.begins_at + 1.day;' '@event.should_not be_valid' 回報有效。 .. 我應該選擇一個更具體的寶石來完成這項工作嗎? – piffy

+0

我糾正自己:在上面的代碼工作,而這並不: '@ event.deadline = @ event.begins_at;' '@event.should be_valid' 回報無效... – piffy

+0

這可能是誤導...你會嘗試'@ event.deadline = @ event.begins_at; @ event.should有(0).errors_on(:截止日期)' –

相關問題