如何识别 rails 中的无效日期?

How do I recognize invalid dates in rails?

当修改 Active Record 对象的属性时(如 Task.update date: '2015-01-01'),我想知道该值何时无效('2015-01-32''whatever')。现在,activerecord 只是写 nil 以防万一,我必须说这不是很友好。以前的值丢失。如果用户没有输入日期之类的内容,我想把它留在那里。

有没有比下面的方法更明智的计算方法?

if ActiveRecord::Attribute.from_user('date', '2015-01-32', ActiveRecord::Type::Date.new).value
  puts 'valid date'
end

P.S。以防万一someone wants to know how type casting happens.

你可以尝试解析它,当它引发错误时它是无效的:

valid = Date.parse('2015-01-30').present? rescue false  # true

valid = Date.parse('2015-01-32').present? rescue false  # false

如果没有办法告诉 activerecord 不要丢弃值,并且没有 public 接口来检查日期是否有效,那么最好的选择必须是使用 validation :

class Task < ActiveRecord::Base
  validates_date :date
end