2010-04-06 62 views
4

模型驗證錯誤我有一個虛擬屬性加入救援

class Mytimeperiod < ActiveRecord::Base 
    validates presence of :from_dt 
    validates_format_of :from_dt, :with => /\A\d{2}\/\d{2}\/\d{4}\Z/, :message => "format is mm/dd/yyyy" 

    def from_dt 
    self.from_date.strftime("%m/%d/%Y") if !self.from_date.blank? 
    end 

    def from_dt=(from_dt) 
    self.from_date = Date.parse(from_dt) 
    rescue 
    self.errors.add_to_base("invalid from dt") 
    end 
end 

我使用<%= f.error_messages %>到在窗體上顯示的錯誤信息下面的模型。

我正在使用from_dt作爲虛擬屬性(字符串)。在表單上顯示'存在'和'格式'驗證錯誤,但是當用戶在表單上輸入無效日期格式並且Date.Parse引發異常時,我在挽救條款中有一個'errors.add_to_base'語句。任何人都可以告訴我爲什麼當我禁用'格式'驗證時,這個錯誤不會出現在表單錯誤消息中。

謝謝。

回答

-1

我相信問題其實只是你的語法,你需要開始添加begin到開始塊具有rescue

def from_dt=(from_dt) 
    begin 
    self.from_date = Date.parse(from_dt) 
    rescue 
    self.errors.add_to_base("invalid from dt") 
    end 
end 
+1

由於方法'def'被認爲是該塊的'begin',因此不需要開始塊。你可以在'irb'中測試。 – 2010-04-06 22:57:06

+0

啊,我想你是對的。 – 2010-04-07 02:24:40

0

你的語法看起來OK。如果您在控制檯中測試問題,請確保執行reload!(或退出並再次運行script/console)。

如果您使用的是虛擬屬性的唯一原因是驗證日期格式,不要忘了,你可以用validate方法(未經測試)使自己的驗證:

class Mytimeperiod < ActiveRecord::Base 

    protected 

    def validate 
    date = Date.parse(from_date) 
    rescue 
    errors.add("from_date", "date is invalid") 
    end 
end 

這樣做的將錯誤添加到字段而不是對象的優點。驗證獲取運行時

+0

問題不在控制檯中。錯誤消息不會顯示在窗體上 – user290870 2010-04-07 17:49:01

+0

您是否嘗試在控制檯或單元測試中對其進行測試?錯誤是否添加到對象? – zetetic 2010-04-07 19:20:36

+0

我在控制檯中檢查過,它顯示的唯一錯誤是'from_dt不能爲空',這是因爲我的類definiton中的'validates_presence_of'方法。來自rescue子句的錯誤消息不會添加到errors數組中。謝謝。 – user290870 2010-04-08 06:21:07

11

錯誤驗證回調之外添加將被刪除 - ActiveModel

所以,你必須從一個驗證回調中添加你的錯誤,而不是在一個二傳手。這應該工作:

class Mytimeperiod < ActiveRecord::Base 
    validates presence of :from_dt 
    validates_format_of :from_dt, :with => /\A\d{2}\/\d{2}\/\d{4}\Z/, :message => "format is mm/dd/yyyy" 

    validate :from_dt_must_parse 

    def from_dt 
    self.from_date.strftime("%m/%d/%Y") if !self.from_date.blank? 
    end 

    def from_dt=(from_dt) 
    self.from_date = Date.parse(from_dt) 
    rescue 
    @from_dt_parse_error = "not recognizable as a date" 
    end 

    def from_dt_must_parse 
    self.errors[:from_dt] = @from_dt_parse_error 
    end 
end