2011-10-29 49 views
0

我使用Rails 3.0.3,我有相當廣泛的驗證過程。導軌:驗證與參數

我想要在我檢查驗證,如果某個變量是合適的日期

基本上這就是我想要做的是:

def validate_date(this_date)? 

    begin 
     Date.parse(this_date) 
    rescue 
     proper_date = false 
    else 
      proper_date = true 
    end 
end 

,並使用調用此方法在我的模型:

attr_accessor :given_date  
validate_date(given_date) 

而且在使用例如在我的驗證文件另一個地方:

或類似的東西...

我需要做什麼才能做到這一點?

回答

1

你應該做的是類似於NKM的回答了一句:

validates :name, 
    presence => true # or other standard validations 
validate :valid_my_date_variable 

def valid_my_date_variable 
    if my_date_variable.present? 
    errors[:my_date_variable] << "is not valid" unless valid_date(my_date_variable) 
    end 
end 

def validate_date(this_date)? 
    begin 
    Date.parse(this_date) 
    rescue 
    proper_date = false 
    else 
    proper_date = true 
    end 
end 

或者你可以爲你的約會創建驗證和使用標準驗證使用它。

參考documentation如何,如果你喜歡保持你的模型清潔創建自定義的驗證。

+0

感謝。有你的代碼,但我的一些小錯誤可以修復它,這種方法的作品! – Christoffer

3

要添加而不是返回false錯誤,所以不是你想使用:

errors.add(:date, "is invalid") 
+0

謝謝,我其實已經做到了。但它並沒有真正解決我的問題的核心。我應該如何使用參數來調用這個函數。 – Christoffer

0

假設this_date是我們需要驗證的屬性(列),我們可以做到以下幾點,

validate :validate_date 

    def validate_date 
    begin 
     Date.parse(this_date) 
    rescue 
     errors.add(:this_date, "is not valid") 
    end 
    end 

參考:http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-a-symbol-with-if-and-unless

+0

我不太確定。這將使名稱的存在被驗證IN CASE日期被驗證。如果驗證日期返回false,則它不會驗證名稱。它不會影響錯誤是否會被公開(除非結合使用可能與尼克拉斯答案)。 Alos,調用方法使用:validate_date(this_date)?似乎沒有工作。我得到這個錯誤:語法錯誤,意外「(」,希望keyword_end ... =>真,如果=>:?validate_date(given_date) – Christoffer

+0

對不起,我錯誤地理解您的查詢更新了上面的代碼... – nkm

0

我的看法是,你不應該這樣做擺在首位。驗證發生在模型的屬性上,而不是針對驗證方法的任何輸入參數。 執行以下操作:

def validate_date 

    begin 
    Date.parse(this_date) 
    rescue 
    errors[:date_attribute] << 'is invalid date' 
    end 
end 

上面這段代碼假設你有你的Model屬性date_attribute。相應地改變。

+0

謝謝,但由於我的應用程序的安裝,我有我的所有驗證在一個文件中(這是必要的),我需要使用的輸入參數,所以這是不行的... – Christoffer