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)

Komentáře

K tomuto postu je 0 komentářů. Přidej vlastní →

Přidej komentář

Povinná pole jsou vyznačena tučně.