Usando un layout diferente con Devise

Muchos usamos la gema Devise para manejar la autenticación de nuestra aplicación Rails dado que provee un gran cantidad de métodos útiles y nos permite agilizar el desarrollo sin preocuparnos mucho por este componente.

Muchas veces queremos realizar ciertas modificaciones al layout que se presenta si el usuario se encuentra autenticado o no, para esto Devise nos da el helper user_signed_in? para mostrar algo si el usuario está autenticado o no, pero hay ocasiones en las que nos encontramos agregando muchos condicionales al layout que hace más sentido crear un layout diferente para las vistas Devise de eso trata este artículo.

La primera opción es crear en nuestro folder de layouts el layout devise.html.erb app/views/layouts/devise.html.erb sin hacer más cambios Rails usará ese layout para todas las vistas del controlador Devise para entender porqué esto funciona así, la lógica que sigue Rails para determinar qué layout usa es:

  1. Busca un layout en app/views/layouts/ con el mismo nombre del controlador
  2. De no encontrar busca en app/views/layouts/ el layout application o un .builder

Más información al respecto se puede encontrar en la documentación de Rails

Ahora esta opción, implica que usará el layout para todas las vistas de Devise, pero que sucede si queremos mostrar un layout cuando nuestros usuarios inician sesión o crean su cuenta, pero otro cuando los usuarios editan su cuenta (ya están autenticados) para esto podemos realizar los siguientes cambios en nuestro application_controller.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
layout :layout_by_resource

protected

def layout_by_resource
if devise_controller? && resource_name == :user && action_name != "edit"
"devise_layout"
else
"application"
end
end
end

Para esto creé un layout llamado devise_layout en app/views/layouts y si vemos, únicamente lo estoy llamando en todas las acciones de Devise que no sean edit, también usamos otro helper que provee Devise llamado devise_controller? que indica si estamos dentro de un controlador Devise

Hasta la próxima!

avatar

Blog neyDroid

Desarrollando Vagancias