保存字符串时,Datetime字段保存nil值

时间:2011-02-22 10:41:33

标签: ruby-on-rails validation datetime

我的Rails应用中的Datetime字段存在问题。我有一个验证应该接受有效的Datetime,并允许null或空值(代码来自我昨天的question):

  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

如何在使用字符串更新后停止将我的日期时间字段设置为nil,同时能够明确地将此字段留空?

2 个答案:

答案 0 :(得分:2)

您的验证很奇怪:datetime_field应该是一个日期,同时它可以是nil或空白。但是零或空白不能是约会。所以你的验证听起来应该是: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?,则永远不需要验证某些内容。对于空对象和nil对象,Blank?将返回true:"".blank? => truenil.blank? => true

答案 1 :(得分:0)

您的datetime_field在迁移中是否标记为日期时间?

如果是这样,datetime_field被设置为nil,因为你传递的字符串不是有效的日期时间字符串。试着这样做:

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

那么假设是

object.datetime_field

应该返回

2010-01-01