Lord Sarevok

Desarrollador web

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