Validates_presence_of Date with '00' year fails

Hi there

I’ve come across an interesting scenario with validates_presence_of
and Dates in Rails. I’ve been looking through the Rails code but I
just can’t figure out where in Rails the date parsing which presumably
causes this issue is happening.

The problem is this. If you try and create a model using a date
string in the format “dd MMM yy” but you specify a year of ‘00’,
‘validates_presence_of’ fails because the Date object Rails converts
the String to is nil. If you specify any other 2-digit year it’s
fine. Here’s a simple example test case:

class Model
validates_presence_of :dated_on
end

this works

m = Model.create(:dated_on => ‘20 Apr 01’)
assert m.errors.empty?

this fails

m = Model.create(:dated_on => ‘20 Apr 00’)
assert m.errors.empty?

Has anyone come across this before and/or would anyone be able to
point me to where in the Rails code base the date is parsed so I can
look at implementing a workaround? I just can’t spot it!

Many thanks
Olly

Ultimately, the parsing of a date comes down to the new_date method in
activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb.
It’s currently on line 166 of that file in edge Rails. That method
returns
nil if the year is 0. I don’t know why it works that way, but at least
you
now know why you see the behavior that you do.

Regards,
Craig