#8 Layouts and content_for
Debajo tenemos un archivo layout de aplicación y una acción index:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>Todo List</title> <%= stylesheet_link_tag 'application' %> </head> <body> <div id="container"> <h1>Todo List</h1> <%= yield %> </div> </body> </html>
application.rhtml[1]
<h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
index.rhtml [1]
Cuando se genera la acción index
, se genera dentro del archivo layout (Ver episodio anterior para más detalles acerca de los layouts). Pero, ¿y si queremos más control sobre el layout y queremos personalizarlo basado en el template que está siendo generado? Digamos que queremos utilizar un archivo CSS personalizado en el template de la acción index
. La solución es utilizar un método helper llamado content_for
en nuestro template. content_for
toma un símbolo como identificador, en este caso :head
, y un bloque. El código colocado dentro del bloque será almacenado para su posterior uso y no aparecerá dentro del template.
<% content_for :head do %> <%= stylesheet_link_tag 'projects' %> <% end %> <h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
index.rhtml[1]
Este cambio no va a generar ningún cambio de por sí, ya que no estamos mostrando el contenido de content_for
. Lo que necesitamos hacer a continuación es mostrar la salida en algún lugar en el layout. Esto puede hacerse realizando una llamada a yield
con el símbolo que le dimos al content_for
. Entonces, al agregar yield :head en un bloque ERB a la sección del encabezado de nuestro layout, el código dentro de content_for :head
en nuestro template será generado en ese lugar.
... <head> <title>Todo List</title> <%= stylesheet_link_tag 'project' %> <%= yield :head %> </head> ...
Observando al código fuente de la página, vemos que la referencia a la hoja de estilo de nuestro bloque content_for
ha sido agregada a la página.
content_for
provee una forma realmente útil de cambiar el contenido de un layout que depende de una acción. Así como se puede utilizar para agregar hojas de estilo, también se puede utilizar para mostrar barras de menú, barras laterales o cualquier otro tipo de contenido que deseemos que aparezca en cierta acción.
Notas
Para Rails 2 y versiones superiores la extensión del archivo debería ser .html.erb en vez de .rhtml.