2013-05-28 3 views
1

У меня есть модель Event, которая имеет start_date и end_date. У меня есть простая проверка, чтобы убедиться, что end_date после start_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_date и start_date заселена в параметрах трассировки, если добавить put start_date (или END_DATE) в проверке end_after_start, он печатает в ноль на консоли.

+0

Какой контроллер выглядит? –

ответ

0

Я получил это для работы, установив драгоценный камень american_date. Это позволяет отображать мое поле даты как MM/DD/YYYY, а также проверять и правильно сохранять дату.

0

Попробуйте установить:

attr_accessor :end_date, :start_date 

Если у вас нет столбцов в базе данных, вы будете нуждаться в этом.

attr_accessible позволяет параметры в массовой ассоциации.

attr_accessor устанавливает геттер и сеттер.

Если у вас есть эти столбцы, вы можете попробовать допинг self..

+0

Когда я это делаю, он сохраняет, но это вызывает другую проблему. На событиях # show, я получаю ошибку '@ event.start_date' - nil. В базе данных есть дата, и когда я удаляю шоу автоматически, она снова работает. – yellowreign

+0

, поэтому я думаю, что ваша проблема связана с другим ответом здесь, попробуйте проанализировать дату перед ее сохранением. –

2

Проблема заключается в том, что ваша форма форматирует ваши даты как «mm/dd/yyyy», и поля передаются вашему приложению в этом формате в виде строк.

Нет никакого неявного преобразования строки в этом формате в DateTime, поэтому ваши start_date и end_date заканчиваются нулем.

Смежные вопросы