Rails praktiky: Element ID generátor
Posledních několik večerů jsem strávil tvorbou docela složitého Ajaxového UI pro jednu novou aplikaci, o které už bude taky brzo co psát. Při této zábavné práci jsem si osvojil jednoduchou a velmi prospěšnou praktiku, o kterou bych se rád podělil. Týká se to přiřazování hodnot atributu id HTML elementů, fuj to zní složitě a přitom je to tak jednoduché.
Začnu jako obvykle jednoduchým příkladem:
<div class="item" id="<%= "item_#{current_item.id}" %>">
... nejaky obsah divu ...
</div>
... zbytek stranky ....
<%= link_to_remote "updatni muj div",
:update => "item_#{current_item.id}",
:url => {:action => "nejaka_akce", :id => current_item }
%>
Aneb po kliknutí na link dojde k nahrazení obsahu elementu div, mezi těmito dvěma elementy je zjevně vazba. Ono to na první pohled vypadá, že už by se tam snad nedalo nic zlepšit. Co se ale stane, když bude odkaz generovaný link_to_remote a samotný div s obsahem v jiné RHTML šabloně? V ideálním případě nic. Pokud si, ale zmyslím, že id ve stylu “item_#{current_item.id}” už nedáva smysl budu muset prolézat spoustu šablon a opravovat to všude manuálně. Když ještě k tomu na něco zapomenu, na první pohled, bude chyba neviditelná a těžce dohledatelná.
Řešení? Na generování opakujících se věcí máme přece helpery! Do helperu pro daný controller si proto přidám:
def item_div_id(item)
"item_#{item.id}"
end
A šabloby pak budou vypadat následovně:
<div class="item" id="<%= item_div_id(current_item) %>">
... nejaky obsah divu ...
</div>
... zbytek stranky ....
<%= link_to_remote "updatni muj div",
:update => item_div_id(current_item),
:url => {:action => "nejaka_akce", :id => current_item }
%>
Proč je to lepší?
- Je to čitelnější. Složité skládání řetězců dáváme pryč od HTML.
- Je to bezpečnější. Při překlepu ve volání helperu se šablona ani nezkompiluje a je jasné, kde je chyba.
- Když budu přidávat další logiku používající tento element půjde to rychleji, protože mě osobně jde psaní normálního ruby rychleji než kód typu ”#{}”
Závěrem jednoduché pravidlo: všecko co se někde generuje více než jednou stejně nebo podobně si zaslouží helper metodu nebo partial.
Jednořádkové metody jsou prostě sexy.