When I have a date that can be nil, I usually end up needing the following code, which I’ve monkey patched into ActiveRecord::Base:
private def string_to_date(value) value = case value when blank? then nil when Date then value else begin Date.parse(value) rescue nil rescue nil end end end
Afterward, I simply use the awesome validates_timeliness plugin with :allow_nil => true.