1

と を持つEventモデルがstart_dateありend_dateます。end_dateが の後にあることを確認するための簡単な検証がありstart_dateますが、日付フィールドが変更されていないのに別のフィールドが更新されている場合、検証は失敗し続けます。このような場合、トレースではレコードが適切なフィールド値を示していても、フィールドが nil であると解釈します。

# 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とが入力されていることを確認しても、検証で (または end_date)を追加すると、コンソールに nil として出力されます。start_dateput start_dateend_after_start

4

3 に答える 3

0

american_dateジェムをインストールすることで、これが機能するようになりました。日付フィールドを MM/DD/YYYY として表示できるようにし、日付を正しく検証して保存します。

于 2013-05-31T18:08:36.547 に答える