我的Event
模型有start_date
和end_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_date
和start_date
填充,如果我在put start_date
验证中添加end_after_start
(或end_date),它也会打印为nil到控制台。
答案 0 :(得分:2)
问题是您的表单将日期格式设置为“mm / dd / yyyy”,并且字段以字符串格式提交给您的应用程序。
没有将该格式的字符串隐式转换为DateTime,因此start_date
和end_date
的结尾为零。
答案 1 :(得分:0)
尝试设置:
attr_accessor :end_date, :start_date
如果您的数据库中没有列,则需要使用该列。
attr_accessible
允许群组关联中的参数。
attr_accessor
设置了一个getter和一个setter。
如果您有这些列,可以尝试预先self.
。
答案 2 :(得分:0)
我通过安装american_date gem来解决这个问题。它允许我的日期字段显示为MM / DD / YYYY并验证并正确保存我的日期。