Ruby on Rails - numery dni z sufiksem st, nd, th. Formatowanie daty.
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.