Por defecto todas las vistas utilizan el layout ubicado en app/views/layouts/application.html.erb.
Dentro de ese archivo application.html.erb vas a encontrar la palabra yield. En esa línea es la que se reemplaza por el contenido de cada vista.
Existen varias formas de cambiar el layout que se va a utilizar al renderizar una vista:
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.
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 falseTambié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
endPor 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:
El 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.
Para 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 /products:
redirect_to products_pathPara redireccionar a un sitio externo simplemente utiliza la URL del sitio de la siguiente forma:
redirect_to "http://www.google.com/"