Tips sobre devise
January 16th 2011#1 Modificar la redirección de la edición del usuario autenticado en la aplicación
Por primera vez me ha hecho falta modificar la forma en la que devise trabaja, voy a explicar un poco lo que hice y como lo resolví, la mayoría está en el wiki, pero bueno, me apetecía compartirlo.
Lo primero que necesité fue redefinir hacia donde nos lleva la edición de un usuario que pasa todas las validaciones que tengamos definidas, muchos de los artículos recomendaban copiar y pegar el controlador para aplicar el cambio, pero no me gustaba, me guié por uno que nos explicaba como redefinir la redirección cuando cerramos sesión pero combinándola el método que nos envía a donde deseemos tras una edición satisfactoria, quedando algo así en el ApplicationController. En este caso lo vamos a enviar al show del usuario.
class ApplicationController < ActionController::Base
....
private
# => Método que nos redirige a otra url diferente del root path al actualizar el usuario
def after_update_path_for(resource)
my_account_path
end
....
end
Me pregunto si será una solución más limpia que la que recomienda josevalim en este post, de esta forma evitamos un controlador ya testado.
Lo que nos falta es la acción donde nos va a llevar el 302, para ello definimos la ruta “dentro de devise” con los helpers para rutas que nos proporciona este plugin.
devise_for :users do
get 'my-account', :to => 'users#show', :as => :my_account
end
Para terminar nos falta la acción del controlador a la que llevamos la ruta, he creado uno para seguir con mi encabezonamiento de no tocar el registrations_controller.
class UsersController < ApplicationController
before_filter :authenticate_user!
def show
@user = current_user
end
end
En este caso no es necesario heredar del registrations_controller ya que esta acción no está definida en esa clase.
#2 Guardar un usuario que nos envía el password vacio
Otra pequeña modificación que necesité es la de evitar que salten las validaciones del password una vez el usuario hace el submit del formulario, devise por defecto comprueba que esos dos campos vengan con datos, en caso de enviárselos vacíos, para él es un registro no válido, esa solución es sencilla, no hay más que redefinir un método de instancia en el modelo, es una de las soluciones que nos indican en la wiki
def update_with_password(params = {})
if params[:password].blank?
params.delete(:password)
params.delete(:password_confirmation) if params[:password_confirmation].blank?
end
update_attributes(params)
end