Usando content_for

Dicas - 28/Out/2019 - por Henrique Morato

Durante o desenvolvimento em Rails, diversas vezes precisamos mudar o título da página ou colocar um JavaScript no final de tudo. Para tornar esse tipo de ação mais rápida e prática o Rails criou o content_for.

Imagine que temos um lay-out:

# app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>Um App Rails</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

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

Se quisermos customizar o título, dependendo da página que estamos podemos usar o yield passando um symbol:

# app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= yield :title %></title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

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

Agora podemos usar o content_for para entrar no lugar do yield:

# uma outra view qualquer
<% content_for :title { 'Titulo da página' } %>

Pronto! Você pode mudar o título de cada página. Com o content_for também é possível abrir um bloco caso queira colocar mais HTML ou JavaScript. Você também pode dar uma olhada no content_for? para verificar a existência e, caso não exista, utilizar um valor padrão.