我有一个具有datetime属性的模型.我试图验证将更新模型的传入
JSON.但是如果ActiveRecord是无效的日期时间,ActiveRecord似乎将该属性的值设置为nil.我无法使用适当的错误进行响应,因为该属性被允许为零.我究竟做错了什么?
码:
class DatetimeValidator < ActiveModel::EachValidator def validate_each(record,attribute,value) value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.") end end class Foo # column :my_date,:datetime validates :my_date,:allow_nil => true,:datetime => true end
安慰:
1.9.3p125 :001 > x = Foo.new => #<Foo id: nil,my_date: nil> 1.9.3p125 :001 > x.my_date = 'bad value' => 'bad value' 1.9.3p125 :001 > x.my_date => nil 1.9.3p125 :001 > x.valid? => true
就ActiveRecord而言,将datetime属性设置为“bad_value”等同于将其设置为nil,因此我不能验证它,因为my_date不是必需的.这似乎是我的错误.什么是最好的解决方法?
谢谢!
解决方法
一个解决方法是将allow_nil部分移动到date_time验证中:
class DatetimeValidator < ActiveModel::EachValidator def validate_each(record,value) return if value.blank? value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.") end end class Foo validates :my_date,:datetime => true end
编辑:我认为这是一个类型转换的问题 – 尝试这个(从代码验证:数字)改编:
def validate_each(record,value) before_type_cast = "#{attribute}_before_type_cast" raw_value = record.send(before_type_cast) if record.respond_to?(before_type_cast.to_sym) raw_value ||= value return if raw_value.blank? raw_value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.") end