Ak ste v Rails programovali aplikáciu pre slovenských užívateľov, tak ste sa mohli stretnúť s tým, že dáta vo formulároch sa nevypisujú v takom formáte, ako by ste si želali. Napríklad čísla s desatinnou „bodkou“ namiesto čiarky. Alebo dátumy vo formáte 2013-07-19 namiesto 19. 7. 2013.
Bohužiaľ s týmto si štandardná i18n rails lokalizácia neporadí, preto je vhodné napísať si vlastné helper metódy. Toto sú tie moje, fungujúce v Rails 4.
# helpers pre formularove polia # mozete ich vlozit do app/helpers/application_helper.rb class ActionView::Helpers::FormBuilder def localized_date_field(date, params_hash = {}) params_hash[:value] = object.send(date).nil? ? nil : I18n.localize(object.send(date)) text_field date, params_hash end def localized_number_field(number, params_hash = {}) params_hash[:value] = object.send(number).nil? ? nil : object.send(number).to_s.sub('.', ',') text_field number, params_hash end end
Potom Vám stačí v šablóne pre formulár zavolať len nasledujúci kód pre dátum:
<%= f.localized_date_field :date %>
prípadne číslo:
<%= f.localized_number_field :number %>
Ak máte nastavené aj locale na slovenčinu, tak sa už dátumy a čísla budú zobrazovať správne.
Avšak ostáva tu ešte jeden problém. A to, že Rails pri ukladaní čísla odignoruje všetko čo je za čiarkou. Čiže z 3,14 sa stane 3.
Toto treba ošetriť na úrovni modelu a treba vytvoriť vlastnú set metódu pre daný atribút. Príklad pre atribút number
.
# hack, aby sa ',' konvertovala na '.' def number=(value) if value.respond_to?('sub') value.sub!(',', '.') end write_attribute(:number, value) end
Čo sa dátumu týka, tak tam Rails korektne spracuje aj dátum zadaný v slovenskom formáte.
Nie je na to nejaký gem?
Ale áno je, volá sa delocalize a toto všetko robí automaticky. Bohužiaľ s Rails 4 nefunguje, čiže mne bol nanič ;). Moje Ruby a Rails znalosti nie sú ešte na takej úrovni, aby som ho dokázal upraviť na Rails 4. A okrem toho sa mi ten kód v ňom zdal prasácky. Ale to možno bude len tými znalosťami ;).
Pridaj komentár