Yield vs content_for

yield está presente em todos os layouts de uma aplicação Rails pois ele identifica onde o conteúdo de uma view será inserido, no entanto isso é a forma simples de se trabalhar e é aí onde entra content_for. Vamos aprender mais essa?

yield é algo comum que todo desenvolvedor Rails entende logo nos primeiros passos do aprendizado do framework. Ao olharmos o layout padrão (/app/views/layout.html.erb) da aplicação ele indica o lugar onde a view acessada através de uma requisição será inserida.

É claro que o yield em si é algo que vem do estudo dos blocks em Ruby, que veremos em outra oportunidade, mas para esse momento vamos focar apenas no arquivo de layout.

Pois bem, imaginando o exemplo abaixo…

<html>
<head>
</head>
<body>
<%= yield %>
</body>
</html>

…como falado, o yield é o lugar onde a view será renderizada e inserida no momento em que acessarmos uma URL da aplicação. Ou seja, imaginando que criamos um scaffold de Users, podemos acessar http://localhost:3000/users e isso nos levará para o controller useraction index e consequentemente a view app/views/users/index.html.erb será renderizada no local onde o yield está.

Até aí não temos novidade pois esse é o funcionamento padrão do Rails, no entanto podemos adicionar um novo yield no layout, dessa vez “nomeado-o”, veja:

<html>
<head>
<%= yield :minha_head%>
</head>
<body>
<%= yield %>
</body>
</html>

Acima usamos o yield :minha_head que é uma nova área onde poderemos renderizar algo. Comumente, o yield sem a nomeação funciona como falado até agora, mas no momento em que nomeamos ele, nesse caso com “minha_head”, podemos usar o método content_for para nos auxiliar a renderizar “pedaços” de código que devem existir apenas em páginas específicas.

Para um exemplo, imagine que em nosso scaffold, apenas na view show queremos que seja carregado um javascript específico para mostrar um alerta.

Sendo assim, basta que na página app/views/users/show.html.erb coloquemos a entrada abaixo…

<% content_for :minha_head do %>
<script>alert('Testando o content_for!!!')</script>
<% end %>

Prontinho, dessa forma o alert será adicionado ao layout apenas quando a página show for acessada. Simples, não é mesmo? 🙂

Então é isso, gente! Espero que tenho gostado e entendido.

Lembre-se, claro, de nos seguir da redes sociais e se cadastrarem em nossa newsletter semanal. Um forte abraço!