Named routes aneb pojmenovaná směřování
Při nedávném předělávání Boomy.cz do nového kabátku jsem znovu propadl fenoménu v Rails zvanému named routes.
Named routes jsou v Rails prostředek jak naše specifické url nejenom efektivně zobrazit, ale také zefektivnit a zpřehlednit kód aplikace a to převážně šablon.
Předvedu názorně na příkladu. Když máte v aplikaci nadefinované jenom základní routy, používáte všude v kódu, ač nevědomě, funkci url_for, která z hashe parametrů { :controller => “nejaky_controller”, :action => “nejaka_action” }, generuje URL (url_for volá link_to a všechny podobné). Napsat takový hash je docela práce a dělat to pořád dokola je už fakt otrava. Zachrání nás named routes.
Ještě nedávno jsem všude po šablonách Boomy.cz generoval odkazy právě přes url_for. Spousta zbytečných znaků a ani adresy stránek nebyly tak pěkné. V routes.rb mi včera přibylo:
map.boomy '',
:controller => "boom", :action => "index"
map.novinky 'novinky',
:controller => "boom", :action => "novinky"
map.nejlepsi 'nejlepsi',
:controller => "boom", :action => "best_of"
Jaké to má následky?
1) Mám pěkné URL: url_for(:controller => “boom”, :action => “novinky”) vrací ”/novinky”
2) Šetřím si prsty protože místo link_to “novinky”, :controller => “boomy”, :action => “novinky” teď píšu jenom link_to “novinky”, novinky_url
Rails totiž pro každou named route vytvoří helper metodu s názvem název_url. Tu pak lze použít místo konfiguračního hashe.
U bodu 2 bych se chtěl ještě zastavit. Myslím, že benefit speciální route je viditelný na první pohled. Ještě větší úsměv na tváři vám vykouzlí následující porovnání:
link_to("novinky",
{ :controller => "boomy", :action => "novinky" },
{ :class => "veliky zeleny odkaz", :id => "id elementu" }
)
versus
link_to("novinky", novinky_url, :class => "veliky zeleny odkaz", :id => "id elementu")
Vidíte? Při generování stránek se složitějším designem jsou named routes nutností, jinak se z kódu stává balast, ve kterém se nedá orientovat. Zastávám názor, že url_for by se v šabloně vůbec nemělo používat, všechno generování adres by měli zastávat named routes nebo alespoň helper metody, které zabrání duplikaci hashů.
A jak se to použije na složitějším případě? Jednoduše!
map.detail_novinky 'detail/:id',
:controller => "boom", :action => detail"
pak v šabloně
link_to "Podrobnosti...", detail_novinky_url(:id => @novinka)