Ruby on Rails: Lokalizované formulárové polia pre čísla a dátum

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

Comments

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *