#7 All About Layouts
En este episodio veremos todo acerca de los layouts. Los layouts son archivos de vistas (views) que definen el código que rodea un template. Pueden compartirse a varias acciones y controladores.
Layouts de aplicación
El template debajo, lista todos los proyectos.
<h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
Esto genera una página web básica.
Si deseamos agregar, por ejemplo un encabezado, un logo o un menu de navegación al sitio y deseamos que sea visible en todas las páginas, entonces deberíamos utilizar un layout. Los archivos de layouts se encuentran en la carpeta /app/views/layouts
de una aplicación Rails. Para crear un layout, crearemos un archivo llamado application.rhtml
[1] en la carpeta layouts. Esto creará un layout global que será utilizado por todos los controladores y todas las acciones. El archivo layout de nuestra aplicación se vería así:
<h1>Application Layout!</h1> <%= yield %>
La línea importante del código de arriba es la segunda. La palabra yield
le indica al layout donde ubicar el contenido del template que está utilizando el layout. Ahora, si volvemos a observar la página de arriba veremos que el layout ha sido agregado.
El layout es global, por lo que será agregado a cualquier acción en cualquier controlador de la aplicación. La mayoría de las veces esto será suficiente; pero, ¿y si necesitamos diferentes layouts para diferentes partes de nuestra aplicación?
Layouts específicos por controladores
Un layout puede ser hecho específicamente para un controlador, nombrándolo como el controlador al que va a servir. Entonces, para crear un layout que será utilizado por todas las acciones en el controlador Projects
, debemos crear un archivo en la carpeta layouts llamado projects.rhtml
[2]. Esto significa que el layout será utilizado solamente por el controlador Projects.
<h1>Project Layout!</h1> <%= yield %>
¿Y si quisiéramos compartir un layout a través de un número de controladores, no solo uno, por ejemplo, un layout para admin (administración)? Rails permite usar el comando layout
para especificar el nombre del layout que debería utilizarse dentro de un controlador.
class ProjectsController < ApplicationController layout "admin" def index @projects = Project.find(:all) end end
Layouts dinámicos
Los layouts pueden también utilizarse de forma dinámica. Alguna vez, podríamos necesitar solo un layout admin
cuando el usuario se encuentra logueado a la aplicación. Esto puede realizarse pasando un símbolo como argumento al comando layout
y creando un método con el mismo nombre que el símbolo que da nombre al layout que debería utilizarse.
class ProjectsController < ApplicationController layout :user_layout def index @projects = Project.find(:all) end protected def user_layout if current_user.admin? "admin" else "application" end end end
Podemos restringir un layout a una sola acción en un controlador con el comando render
.
def index @projects = Project.find(:all) render :layout => 'projects' end
El layout especificado con el comando render no tendrá en cuenta cualquier layout especificado por el controlador. Para generar una acción sin un layout podemos utilizar
render :layout => false
Notas
- En Rails 2 y versiones superiores el archivo debería llamarse
application.html.erb
. - Tambien, en Rails 2 y versiones superiores la extensión debería llamarse
.html.erb
en vez de.rhtml
.