0.01
No commit activity in last 3 years
No release in over 3 years
Make ActiveRecord understand any date format you want.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 2.8.0
~> 1.3.3

Runtime

 Project Readme

flexible_date¶ ↑

<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.

How to use¶ ↑

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

How to install¶ ↑

Just run:

gem install flexible_date

How to contribute¶ ↑

Write tests, implement your contrib, pass the tests, make a pull request. Tests are run using RSpec.

Do you know a better/standard solution?¶ ↑

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.