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.

<br />
# helpers pre formularove polia<br />
# mozete ich vlozit do app/helpers/application_helper.rb<br />
class ActionView::Helpers::FormBuilder<br />
  def localized_date_field(date, params_hash = {})<br />
    params_hash[:value] = object.send(date).nil? ? nil : I18n.localize(object.send(date))<br />
    text_field date, params_hash<br />
  end</p>
<p>  def localized_number_field(number, params_hash = {})<br />
    params_hash[:value] = object.send(number).nil? ? nil : object.send(number).to_s.sub('.', ',')<br />
    text_field number, params_hash<br />
  end<br />
end<br />

Potom Vám stačí v šablóne pre formulár zavolať len nasledujúci kód pre dátum:

<br />
&lt;%= f.localized_date_field :date %&gt;<br />

prípadne číslo:

<br />
&lt;%= f.localized_number_field :number %&gt;<br />

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.

<br />
# hack, aby sa ',' konvertovala na '.'<br />
def number=(value)<br />
  if value.respond_to?('sub')<br />
    value.sub!(',', '.')<br />
  end<br />
  write_attribute(:number, value)<br />
end<br />

Č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

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