Rails Girl – Rails for Newbies

Ruby on Rails for Newbies

Partials, reutilização de código no Rails agosto 5, 2008

Filed under: Ruby on Rails — amandavarella @ 8:10 pm
Tags: ,

Partials são pedaços de página que podem ser reutilizados pra evitar replicação de código. Pra quem vem do mundo Java, as Partials fazem algo semelhante ao Tiles, vc vai juntando os “pedaços” conforme a sua necessidade. Então vai um simples, mas muito útil exemplo de Partials em Rails.

Vou utilizar o exemplo que eu tenho aqui, onde eu fiz o scaffold* para o modelo “reading”.
Na view index.html.erb foi gerado o seguinte trecho de código:

 
#index.html.erb

<% for reading in @readings %>
<tr>
<td><%=h reading.url %></td>
<td><%=h reading.text %></td>
<td><%=h reading.page %></td>
<td><%=h reading.time %></td>
<td><%= link_to ‘Show’, reading %></td>
<td><%= link_to ‘Edit’, edit_reading_path(reading) %></td>
<td><%= link_to ‘Destroy’, reading, :confirm => ‘Are you sure?’, :method => :delete %></td>
</tr>
<% end %>

Eu gostaria de reutilizar o trecho que está exibindo cada “reading”, então, eu vou retirar e colocar este trecho de código em uma Partial, assim eu posso chamá-la em qualquer outro lugar da minha aplicação, onde eu queira exibir as informações da mesma maneira.

Uma partial é um arquivo que começa com um “_”, underscore, underline…. então vou criar um arquivo _reading.html.erb (dentro da pasta de views de readings), e vou pegar todo o código que estava dentro do meu for. Este será o conteúdo da partial:
#_reading.html.erb

<tr>
<td><%=h reading.url %></td>
<td><%=h reading.text %></td>
<td><%=h reading.page %></td>
<td><%=h reading.time %></td>
<td><%= link_to ‘Show’, reading %></td>
<td><%= link_to ‘Edit’, edit_reading_path(reading) %></td>
<td><%= link_to ‘Destroy’, reading, :confirm => ‘Are you sure?’, :method => :delete %></td>
</tr>

E finalmente vou alterar o meu index.html.erb, substituindo:

#index.html.erb



<tr>
<td><%=h reading.url %></td>
<td><%=h reading.text %></td>
<td><%=h reading.page %></td>
<td><%=h reading.time %></td>
<td><%= link_to ‘Show’, reading %></td>
<td><%= link_to ‘Edit’, edit_reading_path(reading) %></td>
<td><%= link_to ‘Destroy’, reading, :confirm => ‘Are you sure?’, :method => :delete %></td>
</tr>

Por uma única linha:

#index.html.erb

<%= render :partial => 'reading', :collection => @readings%>

A partial receberá a collection “readings” como parâmetro.

Simples, bonito, e limpo!

Newbies Corner:
Scaffold é uma operação do Rails onde vc passa um nome de modelo e os campos, e ele gera uma aplicação CRUD (Create, Retrieve, Update e Delete) completa.
Ex: o comando “script/generate scaffold person name:string tel:number” vai gerar um cadastro completo de pessoas com nome e telefone, permitindo listar, excluir e alterar cada registro.

Anúncios
 

7 Responses to “Partials, reutilização de código no Rails”

  1. Davi Vidal Says:

    E se eu quiser usar essa mesma partial (_readings) em outro lugar?
    Quero dizer: tenho 2 controller: readings e writers.
    Quando eu entrar em /writers eu quero ter um widget mostrando _readings, entende?

    Você sabe como eu faço?
    Só adicionando um @readings = Readings.find(:all) em WritersController mesmo?

    Obrigado. =)

  2. André Luiz Kupkovski Says:

    O conteúdo da partial (_reading.html.erb) deveria ser o “for”, e não uma chamada a própria partial.

    Errinho de digitação
    😛

    Parabéns pelo blog!
    😀

  3. amandavarella Says:

    Boa pergunta Davi! Também vou precisar fazer isso. Então, se vc quiser utilizar esta partial no seu controller “writers”, vc vai precisar fazer duas alterações:

    1- Esta que vc falou no comentário @readings = Readings.find(:all), pq senão não tem jeito, vc tem que indicar ao controller quais readings vc quer

    2 – Na sua view de writers, vc vai colocar o render da indicando:
    render :partial =>
    ‘seu_outro_controller/nome_da_partial’
    Então no nosso caso vai ficar assim:
    ‘readings/reading’, :collection => @readings%>

  4. amandavarella Says:

    Claro André! É a maldição do copy and paste! Muito obrigada pela correção! Ja acertei!

  5. André Luiz Kupkovski Says:

    ehehehe essa maldição é terrivel 😛

    De nada Amanda!
    É um prazer ajudar.
    Parabéns pela iniciativa e sucesso com o blog!

  6. Davi Vidal Says:

    @André: o conteúdo da partial não tem o for… 🙂

    Nesse caso, ficaria assim:

    #_reading.html.erb

    ‘Are you sure?’, :method => :delete %>

  7. amandavarella Says:

    Ê Davi! Obrigada! Nossa.. esse post tá difícil de sair correto! Mas agora acho que está certo! Revise de novo! 🙂


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s