Поле Datetime сохраняет нулевое значение при сохранении строки - PullRequest
0 голосов
/ 22 февраля 2011

У меня проблема с полем Datetime в моем приложении Rails.У меня есть проверка, которая должна принимать действительные значения Datetime и разрешать нулевые или пустые значения (код взят из моего вопроса вчера):

  include ActiveModel::Validations
  class DateValidator < ActiveModel::EachValidator
    def validate_each(record,attribute,value)
      record.errors[attribute] << "must be a valid datetime" unless ((DateTime.parse(value) rescue nil))
    end
  end
  validates :datetime_field :date => true, :allow_nil => true, :allow_blank => true

Однако, если установить поле datetime_field в какую-то строку, моймодель переопределяет предыдущее значение поля datetime_field и устанавливает его равным nil (в консоли rails я получаю следующее:

object.update_attributes("datetime_field" => "Now")
true
object.datetime_field.nil?
true

Как прекратить установку поля datetime на nil после обновления со строкой, и в то же время сохранитьвозможность явно очистить это поле?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Ваши проверки странные: поле datetime_field должно быть датой, и в то же время оно может быть нулевым или пустым.Но ноль или бланк не может быть датой.Таким образом, ваша проверка должна звучать так: datetime_field should be DATE or BLANK or NIL:

include ActiveModel::Validations
class DateOrBlankValidator < ActiveModel::EachValidator
  def validate_each(record,attribute,value)
    record.errors[attribute] << "must be a valid datetime or blank" unless value.blank? or ((DateTime.parse(value) rescue nil))
  end
end
validates :datetime_field :date_or_blank => true

UPD

Только для уведомления.nil.blank? => true.Поэтому вам никогда не нужно проверять что-либо, если оно равно nil, если вы проверяете, является ли оно blank?.Blank? вернет true для пустых объектов и для nil-объектов: "".blank? => true, nil.blank? => true

0 голосов
/ 22 февраля 2011

Ваше поле datetime_field помечено как datetime в вашей миграции?

Если это так, поле datetime_field устанавливается равным nil, поскольку переданная вами строка не является допустимой строкой datetime.Попробуйте сделать это вместо этого:

object.update_attributes("datetime_field" => "2010-01-01")
true

Предположим, тогда

object.datetime_field

должно вернуть

2010-01-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...