2013-11-23 24 views
0

我正在嘗試驗證Rails 4應用程序中的某些日期,但它不工作。Rails 4.0自定義驗證器不工作

我看了很多類似的代碼示例,如Same custom validation for several fields in Railshttp://railscasts.com/episodes/211-validations-in-rails-3。 (和其他更復雜)。我不明白爲什麼我的例子不起作用。試圖找到問題,我已經剝離了實際的驗證代碼,並留下了一個存根,因爲驗證似乎沒有運行,這似乎是基本問題(或至少,第一個問題)。

下面是在驗證程序代碼(這是在應用程序/驗證/ custom_date_validator.rb

class CustomDateValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    puts "Custom validator was called" 
    record.errors[attribute] << "Date Not Valid" unless false 
    end 
end 

下面是來自模型的代碼:

class CaseInformation < ActiveRecord::Base 
    include ApplicationHelper 
    validates :started, :custom_date => true 

的錯誤信息是:

argument out of range 
Extracted source (around line #104): 
respond_to do |format| 
104 if (@case_information.update_attributes(params[:case_information]) && @case_information.update_attributes(params[:law_guardians])) 
format.html { redirect_to @case_information, notice: 'Case information was successfully updated.' } 
format.json { head :no_content } 

錯誤是(我認爲)故意,我把一個日期「2012年1月1日」,但驗證程序不是捕捉它。好吧,實際上我刪除了所有的驗證代碼,並且(我認爲)驗證器寫入日誌,因爲它似乎並沒有驗證器運行,至少在日誌中沒有顯示它運行的任何東西。

我知道驗證代碼被找到,因爲在模型中,如果我更改驗證名稱,即使有點我也會得到一個錯誤,驗證無法找到。

真的愚蠢noob問題我相信,你的耐心是讚賞。

謝謝。

回答

0

在驗證程序運行之前確實失敗 - 當您在不能存在的日期調用Time.parse時,會發生「參數超出範圍」錯誤。在IRB:

2.0.0p247 :004 > require 'time' 
=> true 
2.0.0p247 :005 > Time.parse("1/123/2012") 
ArgumentError: argument out of range 

而且我打賭starteddatetimetimestamp屬性,對不對? Rails嘗試將params散列中的字符串轉換爲之前的任何驗證運行。

+0

謝謝卡羅爾,還沒有檢查,但你說什麼似乎非常現貨。我想我必須做更多的研究來完成驗證。也許不把價值看作是它的屬性,而是像字符串一樣,看看我能否解析它?看起來很尷尬。有更容易的方法嗎?切換到Rails 4的問題?似乎Rails 3中有很好的日期驗證器,但在Rails 4中更少? – codenoob

+0

你真的想解決什麼問題?如果您試圖阻止某人輸入無效日期,是不是正在進行類型轉換?你想讓人們輸入諸如「2012年1月1日」之類的東西嗎?如果你這樣做,那麼它是否真的是你想用於該屬性類型的日期呢? – carols10cents

+0

謝謝卡羅爾。我試圖對你的評論投票,但我沒有代表這樣做。無論如何,我所要做的就是驗證Rails 4中的日期時間,並且我必須錯過一些東西,因爲它看起來並不直截了當。我似乎無法捕捉到類型轉換引起的異常,它在我的驗證程序啓動之前就已經消失了。我是否在控制器中的編輯操作周圍進行了陷阱? – codenoob