1

我有一个Event模型,它有一个start_dateend_date。我有一个简单的验证,以确保在end_date之后start_date,但是,当日期字段未更改但另一个字段已更新时,验证仍然失败。在这种情况下,它解释字段为零,即使在跟踪中,记录显示正确的字段值。

# 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_dateand填充,如果我在验证中添加(或 end_date),它也会在控制台中打印为 nil。start_dateput start_dateend_after_start

4

3 回答 3

1

问题是您的表单正在将您的日期格式化为“mm/dd/yyyy”,并且这些字段正在以该格式作为字符串提交给您的应用程序。

没有将该格式的字符串隐式转换为 DateTime,因此您的start_dateend_date最终为零。

于 2013-05-28T22:27:24.703 回答
0

尝试设置:

attr_accessor :end_date, :start_date

如果您的数据库中没有这些列,您将需要它。

attr_accessible允许质量关联中的参数。

attr_accessor设置一个 getter 和一个 setter。

如果您有这些列,您可以尝试在self..

于 2013-05-28T22:20:46.910 回答
0

我通过安装American_date gem 来实现这个功能。它允许我的日期字段显示为 MM/DD/YYYY 并正确验证和保存我的日期。

于 2013-05-31T18:08:36.547 回答