Blog jak widać już nie jest aktualizowany. I raczej nie będzie. Wisi sobie ot tak, ze względów historycznych :)

Ruby on Rails - numery dni z sufiksem st, nd, th. Formatowanie daty.

Krzysztof Rygielski | 2009-12-09 17:03 | Kategorie: Rails, Ruby

Wypisywanie daty w Ruby on Rails kiedyÅ› nastrÄ™czaÅ‚o mi trochÄ™ problemów jeÅ›li chciaÅ‚em aby numery dni byÅ‚y zakoÅ„czone sufiksami, np. 1st, 2nd, 5th itd. Wówczas stosowaÅ‚em bardzo Å‚opatologiczne podejÅ›cie, sprawdzajÄ…c jaki jest numer dnia i rÄ™cznie generujÄ…c odpowiedni string z datÄ…. Na szczęście istnieje lepsze rozwiÄ…zanie.

Z pomocÄ… przychodzi metoda ordinalize:

2.ordinalize => "2nd"
3.ordinalize => "3rd"
4.ordinalize => "4th"

Zatem jeśli chcę sformatować datę do postaci np. "24th January 2010" robię tak:

time = Time.now
time.strftime("#{time.day.ordinalize} %B %Y")

OczywiÅ›cie dodawanie podobnego wywoÅ‚ania w każdym miejscu w kodzie, w którym chcÄ™ sformatować jakoÅ› specjalnie datÄ™, jest bardzo nieefektywne. Na Stack Overflow znalazÅ‚em ciekawÄ… metodÄ™. Należy stworzyć w katalogu config/initializers plik, np. date_formats.rb i wypeÅ‚nić go czymÅ› takim:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
   :ordinal_day       => lambda {|time| time.strftime("#{time.day.ordinalize} %B %Y")},
   :datetime          => '%Y-%m-%d %I:%M:%S',
   :time              => '%I:%M:%S',
   :datetime_short    => '%m/%d %I:%M',
)

Po przeÅ‚adowaniu aplikacji nowy initializer zostanie zaÅ‚adowany. Wówczas chcÄ…c sformatować datÄ™ w dowolnym miejscu w kodzie wystarczy zrobić np. tak:

Time.now.to_s(:ordinal_day)

Jest to całkiem wygodne i eleganckie rozwiązanie.