ruby-on-rails – Rails无效的日期时间模型结果为零

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails无效的日期时间模型结果为零前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个具有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

猜你在找的Ruby相关文章