ruby, rails

Blocos para limpar templates

06.15.07 | 5404 Comments
BuscaPé, líder em comparação de preços na América Latina

O PHP tem muitas ferramentas de template e várias delas trabalham com o conceito de blocos. Um bloco é um pedaço de código HTML que deve ser apresentado somente sob determinadas circunstancias. Por exemplo, quando um menu de edição deve ser exibido apenas para os administradores de um blog.

Estou acostumado a utilizar este tipo de recurso quando trabalho com PHP e até pouco tempo sentia falta dele no Rails. É claro que eu poderia colocar a lógica de exibição diretamente no template
[ruby]
< % if current_user.admin? %>
< %= link_to "Editar", article_url(:action => 'edit', :id => @article.id) %>
< % end %>
[/ruby]
mas este código é feio e deixa a lógica de negócios engessada, adicionado dificuldade para a manutenção.

Já que Ruby tem nativamente suporte a blocos, faz sentido que o mesmo conceito que eu costumo aplicar nos templates PHP possam ser aplicados ao Rails, e de fato podem.

O template fica bem parecido, mas agora a lógica fica escondida no controller ou em um helper
[ruby]
< % editbar do %>
< %= link_to "Editar", article_url(:action => 'edit', :id => @article.id) %>
< % end %>
[/ruby]

O método que faz este template funcionar revela algumas manhas de como manipular blocos em Ruby
[ruby]
def editbar(&block)
if current_user.admin?
concat content_tag(:div, capture(&block), :class => ‘editbar’), block.binding
end
end
[/ruby]

O que pode ser novidade na implementação são os métodos capture e concat. O capture deve ser utilizado para que o conteudo passado para o bloco seja “capturado” e utilizado na montagem da div ao invés de ser lançado diretamente para a view, mas . Já o concat serve para concatenar o resultado do bloco ao conteudo da view.

5404 Comments