当它不应该时,Rails认为Field是零

时间:2013-05-28 22:18:39

标签: ruby-on-rails ruby

我的Event模型有start_dateend_date。我有一个简单的验证,以确保end_datestart_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_datestart_date填充,如果我在put start_date验证中添加end_after_start(或end_date),它也会打印为nil到控制台。

3 个答案:

答案 0 :(得分:2)

问题是您的表单将日期格式设置为“mm / dd / yyyy”,并且字段以字符串格式提交给您的应用程序。

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

答案 1 :(得分:0)

尝试设置:

attr_accessor :end_date, :start_date

如果您的数据库中没有列,则需要使用该列。

attr_accessible允许群组关联中的参数。

attr_accessor设置了一个getter和一个setter。

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

答案 2 :(得分:0)

我通过安装american_date gem来解决这个问题。它允许我的日期字段显示为MM / DD / YYYY并验证并正确保存我的日期。