47.26.1. Inflector

Inflector je část Rails zodpovědná za „překlad“ jmen. Z jednotného čísla do množného a naopak, a do různých forem jako je velbloudí forma, podtržítková forma, atd.

pluralize / singularize

Jak již název napovídá, tyto metody převádějí podstatné jméno z jendotného do množného čísla a naopak. Upozorňuji, podstatné jména v jazyce anglickém! Inflector nemusí být při tvorbě množného či jenotného čísla správný, jeho kód nemusí postihovat všechny gramatické zvláštnosti a výjimky. Pokud jsme na pochybách, můžme si ho vyzkoušet.

$ script/console
Loading development environment.
>> Inflector.pluralize 'person'
=> "people"
>> Inflector.singularize 'records'
=> "record"

Chování inflektoru můžeme ovlivnit předefinováním jeho metod. Pokud ale neznáme všechny důsledky takových úprav, měly bychom býti zdrženliví. Svého dosáhneme ve většině případů úpravou pravidel. Od verze Rails 2.0 se konfigurace inflektoru nachází v souboru config/initializers/inflections.rb v dřívějších verzích ji píšeme přímo do souboru config/environment.rb. V obou případech je v konfiguračním souboru uvedena ukázka.

# Add new inflection rules using the following format 
# (all these examples are active by default):
# Inflector.inflections do |inflect|
#   inflect.plural /^(ox)$/i, '\1en'
#   inflect.singular /^(ox)en/i, '\1'
#   inflect.irregular 'person', 'people'
#   inflect.uncountable %w( fish sheep )
# end

Varování

Podle tohoto vzoru si na konec konfiguračního souboru provedeme vlastní úpravy. Upozorňuji že to musí být mimo část Rails::Initializer.run, jinak nám to nebude fungovat.

Pro všechny tabulky, které budeme používat, si zavedeme vztah mezi názvem v množném a jednotném čísle. K tomu použijeme metodu irregular. Například používáme tabulku lidé (lide), kde jednotným tvarem je člověk (clovek).

Inflector.inflections do |inflect|
    inflect.irregular 'clovek', 'lide'
end

Protože nevíme co vše inflector umí, je důležité si své změny hned odzkoušet.

$ script/console
>> Inflector.pluralize 'clovek'
=> "lide"
>> Inflector.singularize 'lide'
=> "clovek"

V našem případě je velmi nepravděpodobné, že by měl inflector naprogramováno slovo clovek mezi uncountable. Ale jeden nikdy neví, co se uvnitř děje. Pokud se nám tedy stane, že po zavedení .irregular nám toto nefunguje, může to být z důvodu že použité slove je definováno v .uncountable. Slova zavedené pomocí metody .uncountable totiž mají přednost slovy zavedenými .irregular. V takovém případě příslušné slovo z .uncountable odebereme.

Podle: http://elia.wordpress.com/2007/07/26/rails-inflector-uncountable-troubles-just-remember-whys-dr-cham/

Inflector.inflections do |inflect|
  # následující řádek nestačí, protože uncountables mají přednost
  inflect.irregular 'equipment', 'equipments'

  def inflect.remove_uncountable word
    @uncountables.delete word
  end

  inflect.remove_uncountable 'equipment'
end

FIXME: Pokud potřebujeme zavést jen pár nových pravidel, například pro práci se podstatnými jmény v jiném jazyce, můžeme se inspirovat přímo ukázkou uvedenou v souboru config/environment.rb:

Také: 47.5.1 – „Prostředí aplikace“

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .