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
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.
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
: