Layouts y rendering
Por defecto todas las vistas utilizan el layout ubicado en app/views/layouts/application.html.erb. Los cambios que hagas en ese archivo van a afectar a todas las vistas.
En general, dentro de ese archivo van elementos que aplican para toda las vistas de la aplicación como el menú principal, el pie de la página, etc.
Dentro del archivo vas a encontrar la palabra yield que es la línea que se reemplaza por el contenido de cada vista.
Cambiando el layout
Existen varias formas de cambiar el layout que se va a utilizar al renderizar una vista:
1. Creando un layout que se llame igual al controlador
Por defecto Rails busca un archivo en app/views/layouts que se llame igual al controlador.
Por ejemplo, si el controlador es pages_controller.rb, Rails busca el archivo app/views/layouts/pages.html.erb y utiliza ese archivo como layout para todas las acciones de ese controlador.
De lo contrario utiliza application.html.erb.
2. Cambiando el layout en el controlador
Puedes definir el layout que van a utilizar todas las acciones de un controlador de la siguiente forma:
class PagesController < ApplicationController
layout "mi_layout"
...
endLa línea layout "mi_layout" le está diciendo a Rails que utilice el archivo app/views/layouts/mi_layout.html.erb como layout de todas las acciones de ese controlador.
Puedes agregar condiciones para que el layout solo aplique a algunas acciones o excluya otras. Por ejemplo, con la siguiente línea el layout mi_layout.html.erb sólo va a aplicar a las acciones index y new del controlador.
layout "mi_layout", only: [:index, :new]También puedes excluir acciones. La siguiente línea utilizará el layout mi_layout.html.erb para todas las acciones exceptuando index:
layout "mi_layout", except: [:index]Puedes evitar que las acciones de un controlador utilicen un layout con la siguiente línea:
layout false3. Cambiando el layout en una acción
También es posible cambiar el layout de una acción particular utilizando render (del que vamos a hablar en detalle más adelante):
class PagesController < ApplicationController
def index
render layout: "mi_layout"
end
endCuando se llame esta acción se va a utilizar el layout app/views/layouts/mi_layout.html.erb para renderizar la vista app/views/pages/index.html.erb.
Para evitar que se utilice un layout para renderizar la vista utilizarías:
class PagesController < ApplicationController
def index
render layout: false
end
endRenderizando y redireccionando
Por defecto, cuando se ejecuta la acción de un controlador, Rails renderiza una vista que se llame igual a la acción (al método) y se encuentre en una carpeta que se llame igual al controlador dentro de app/views.
Por ejemplo, cuando se ejecute la acción index del controlador pages_controller.rb por defecto se va a intentar renderizar la vista app/views/pages/index.html.erb.
Puedes cambiar ese comportamiento de varias formas, por ahora vamos a ver las dos más comunes:
1. Utilizando render
renderEl método render lo utilizamos antes para cambiar el layout. Sin embargo, también lo puedes utilizar para renderizar HTML o una vista diferente.
Para renderizar HTML:
class PagesController < ApplicationController
def index
render html: "<h1>Hola Mundo</h1>"
end
endPara renderizar una vista diferente:
class PagesController < ApplicationController
def index
render "mi_vista" # también funciona: render :mi_vista
end
endEn este caso, en vez de intentar renderizar app/views/pages/index.html.erb se va a renderizar app/views/pages/mi_vista.html.erb.
Si la vista se encuentra en otra carpeta puedes utilizar:
render "products/index" # renderiza app/views/products/index.html.erbPor defecto Rails utiliza el código de respuesta 200 OK pero puedes cambiarlo con la opción status:
render status: 200
# render status: :okCada código tiene su símbolo correspondiente, puedes encontrar la lista completa en este enlace.
2. Utilizando redirect_to para redireccionar
redirect_to para redireccionarPara redireccionar a otra ruta de tu aplicación o a un sitio externo utiliza el método redirect_to. Por ejemplo, la siguiente línea redireccionaría al usuario a /authors:
redirect_to authors_pathPara redireccionar a un sitio externo simplemente utiliza la URL del sitio de la siguiente forma:
redirect_to "http://www.google.com/"Last updated