我的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,同时能够明确地将此字段留空?
答案 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? => true
,nil.blank? => true
答案 1 :(得分:0)
您的datetime_field在迁移中是否标记为日期时间?
如果是这样,datetime_field被设置为nil,因为你传递的字符串不是有效的日期时间字符串。试着这样做:
object.update_attributes("datetime_field" => "2010-01-01")
true
那么假设是
object.datetime_field
应该返回
2010-01-01