<img src=“https://secure.travis-ci.org/rodrigomanhaes/flexible_date.png”/> <img src=“https://gemnasium.com/rodrigomanhaes/flexible_date.png”/>
Make ActiveRecord understand any date format you want.
Within your model, you should do:
flexible_date :my_date_field
And in config/locales/br.yml (or your native language):
br: flexible_date: configuration: format: "%d/%m/%Y" messages: with_suffix: invalid: "inválida." without_suffix: invalid: "inválida."
Or, in a reduced form, when messages for with or without suffix are the same:
br: flexible_date: configuration: format: "%d/%m/%Y" messages: invalid: "inválida."
Date format follows the same pattern used by strptime and strftime. This will generate a my_date_field_flex “property” in which you can enter the date as string in the specified format and then the correct date will be stored in my_date_field.
When an error occurs, the “with_suffix” messages are generated for the “flex” fields and “without_suffix” messages are generated for the regular ones.
Talk is cheap, let’s see the code (given any of the locale files above):
class Event < ActiveRecord::Base flexible_date :start_date, :end_date end event = Event.new event.start_date_flex = "31/01/2011" event.end_date_flex = "28/02/2011" event.start_date.should == Date.new(2011, 01, 31) event.end_date.should == Date.new(2011, 02, 28)
And values assigned to regular fields are returned by _flex fields in the specified format:
event = Event.new :start_date => '2011-01-31', :end_date => Date.new(2011, 02, 28) event.start_date_flex.should == "31/01/2011" event.end_date_flex.should == "28/02/2011"
Suffix can be customized:
class Event < ActiveRecord::Base flexible_date :judgement_day, :suffix => 'yyz' end event = Event.new event.judgement_day_yyz = "28/02/2011" event.judgement_day.should == Date.new(2011, 02, 28)
flexible_date supports conditional execution through the :if option. The object itself is passed as parameter to the block:
class Event < ActiveRecord::Base flexible_date :payday, :if => Proc.new { |n| n.description.blank? } end event = Event.new(:description => "some content") event.payday_flex = "20/05/2011" event.should_not be_valid
Just run:
gem install flexible_date
Write tests, implement your contrib, pass the tests, make a pull request. Tests are run using RSpec.
My intention is to allow users typing dates directly to text fields in their own local format. I didn’t find a solution for this problem in Rails itself. If you have a better solution, please let me know.
No, default select fields, separated by day, month and year are not a solution.
Copyright © 2011 Rodrigo Manhães. See LICENSE.txt for further details.