2013-05-28 40 views
1

我有一個Event模型,它有一個start_dateend_date。我有一個簡單的驗證,以確保end_datestart_date之後,但是,當日期字段未更改時驗證仍然失敗,但另一個字段已更新。在這種情況下,即使在軌跡中,記錄顯示的是合適的字段值,但它解釋的字段爲零。Rails認爲領域是零當它不應該

# error 
undefined method `<' for nil:NilClass 
app/models/event.rb:32:in `end_after_start' 


# validation in event.rb 
attr_accessible :end_date, :start_date  

validate :end_after_start 

def end_after_start 
    if end_date < start_date 
    errors.add(:end_date, "must be after the start date") 
    end  
end 


# request parameters in trace 
{"utf8"=>"✓", 
    "_method"=>"put", 
    "authenticity_token"=>"DD6rVimJxAJclO4IKfv69Txn8XkJZ4IpHZhh+cHOpg4=", 
    "event"=>{"name"=>"Birthday", 
    "start_date"=>"05/16/2013", 
    "end_date"=>"05/31/2013", 
    "commit"=>"Submit", 
    "id"=>"5"} 


# _form  
<%= f.text_field :start_date, :value => (@event.start_date.strftime("%m/%d/%Y") if @event.start_date.present?) %> 
<%= f.text_field :end_date, :value => (@event.end_date.strftime("%m/%d/%Y") if @event.end_date.present?) %> 

即使我看到end_datestart_date居住在跟蹤參數,如果我在end_after_start添加驗證put start_date(或END_DATE),它打印的零到控制檯。

+0

控制器的外觀如何? –

回答

0

我通過安裝american_date寶石得到了這個工作。它允許我的日期字段顯示爲MM/DD/YYYY並正確驗證並保存我的日期。

0

嘗試設置:

attr_accessor :end_date, :start_date 

如果你沒有在你的數據庫中的列,您將需要。

attr_accessible允許以質量關聯的參數。

attr_accessor設置了一個吸氣和一個setter。

如果你有這些列,你可以嘗試預先self.

+0

當我這樣做,它會保存,但它會導致另一個問題。在事件#顯示,我得到錯誤「@ event.start_date」爲零。在數據庫中,日期是在那裏,當我刪除顯示自動再次工作。 – yellowreign

+0

所以我認爲你的問題與這裏的另一個答案有關,試着在保存之前解析日期。 –

2

問題是你的表格格式化日期爲「mm/dd/yyyy」,並且字段以字符串的格式提交給你的應用程序。

沒有將該格式的字符串隱式轉換爲DateTime,因此您的start_dateend_date以nil結尾。