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