Monday, June 09, 2008

Przekazanie bloku kodu do metody helpera

Korzystanie z dobrodziejstwa rubiego jakim jest przekazywanie bloku kodu do metody można wykorzystywać projektując metody w klasach Helperów. Aby wykorzystać ten mechanizm należy jednak zastosować specjalną kontrukcję, którą pokrótce postaram się wyjaśnić.

Załóżmy, że projektowana przez nas witryna składa się z wielu modułów, z których każdy posiada nagłówek oraz treść. Za każdym razem te dwie rzeczy opakowywane są w serię divów z przypisanymi odpowidnimi klasami. Nasze zadanie polegać będzie na tym aby napisać metodę w klasie ApplicationHelper umożliwiającą wstawienie wspomnianego modułu w dowolnym widoku.

Zacznijmy więc od definicji metody:


def modul_tematyczny(tytul, &block)
end


Następnie w widoku umieśćmy następujące wywołanie:


<div ....> .... </div>
<% modul_tematyczny("Wstawiony modul") do %>
<ul>
<% @wiadomosci.each do |wiadomosc|%>
<li> <%= wiadomosc.temat-%> - <%= wiadomosc.updated_at %></li>
<% end %>
</ul>
<% end%>
<div ....> .... </div>


Powróćmy w do helpera i dodajmy odpowiedni kod, tak aby wszystko razem zaczęło działać:


def modul_tematyczny(tytul, &block)
blok = capture(&block)

res = <<HTML
<div class="modul">
<h1 class="tytul">#{tytul}</h1>
<div class='zawartosc'>
#{blok}
</div>
</div>
HTML

concat(res, block.binding)
end


Jak nie trudno zauważyć całą magię stanowią dwa wywołania, które wiążą blok kodu ze zmienną, a następnie zwracają wynik. Zastosowany przykład jest wysoce niedoskonały, ale daje pogląd na możliwości jakie daje nam definiowanie helperów wykorzystujących bloki kodu.

No comments: