2013-04-07 29 views
1

這是我的模型類:如何一起使用默認和自定義驗證器?如何定義他們的訂單?

class Availability < ActiveRecord::Base 
    attr_accessible :beginning_date, :end_date 
    validates :beginning_date, :end_date :presence => true 

    # custom validators 
    validate :dates_cant_be_in_the_past 

    def dates_cant_be_in_the_past 
    if Date.parse(beginning_date) < Date.today 
     errors.add(:beginning_date, "cant be in the past") 
    end 

    if Date.parse(end_date) < Date.today 
     errors.add(:end_date, "cant be in the past") 
    end 
    end 
end 

現在兩件事情應該發生:首先驗證beginning_dateend_date屬性的存在和運行比我dates_cant_be_in_the_past驗證。 可悲的是這種方法不起作用。如果我將字段留空,Date.parse方法會拋出異常,因爲參數顯然是空的。

是否可以定義默認和自定義驗證的順序?還是我要實現的存在驗證自己,所以我會做這樣的事情:

validate :dates_cant_be_blank, :dates_cant_be_in_the_past 

guide至少說:

您可以通過一個以上的符號爲每個類方法和相應的驗證將按照他們的註冊順序執行。

class DateValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if Date.parse(value) < Date.today 
     record.errors.add(attribute, "cant be in the past") 
    end 
    end 
end 

而在你的模型,你會使用這樣的:

class Availability < ActiveRecord::Base 
    attr_accessible :beginning_date, :end_date 
    validates :beginning_date, :end_date :presence => true 
    validates :beginning_date, :end_date, :date => true, :allow_blank => true 
end 

預先感謝

回答

1

如果創建一個驗證它的簡單得多:allow_blank如果該值爲空,則防止驗證運行。使用真正的驗證器對象還會刪除模型中的代碼,使其更簡單,並消除當前擁有的重複。

+0

您的解決方案工作得很好。謝謝。另一個問題:是否可以將我的開始日期和結束日期與您的方法進行比較?我想確保開始日期在結束日期之前發生。 – 2013-04-07 15:11:43

+0

你可以使用相同的驗證器並在其中添加代碼或創建一個新的代碼。 – 2013-04-07 20:48:40

0

你可以嘗試這樣的事情

class Availability < ActiveRecord::Base 
    attr_accessible :beginning_date, :end_date 
    validates :beginning_date, :end_date : presence => true 

    # custom validators 
    validate :valid_dates 


    def valid_dates 
    if valid_string(beginning_date) 
     errors.add(:beginning_date, "Can't be in the past") unless Date.parse(beginning_date) > Date.today 
    end 

    if valid_string(end_date) 
     errors.add(:end_date, "Can't be in the past") unless Date.parse(end_date) > Date.today 
    end 

    end 

    def valid_string(test_value) 
    test.value.is_a? String 
    end 

end 
相關問題