simbolo rails modulos mapas ruby-on-rails devise

ruby on rails - rails - Rieles: ¿cómo sobrescribir el SessionsController para realizar tareas específicas cuando el usuario inicia sesión?



modulos ruby (3)

Alternativamente, puedes crear tu propio controlador de sesiones

class SessionsController < Devise::SessionsController def new super end def create self.resource = warden.authenticate!(auth_options) set_flash_message(:notice, :signed_in) if is_navigational_format? sign_in(resource_name, resource) if !session[:return_to].blank? redirect_to session[:return_to] session[:return_to] = nil else respond_with resource, :location => after_sign_in_path_for(resource) end end end

Y en routes.rb añadir:

devise_for :users, controllers: {sessions: "sessions"}

Usando Devise para administrar sesiones / registros de usuarios, necesitaría realizar tareas específicas (actualizar algunos campos en la tabla de usuarios para este usuario específico, por ejemplo) cada vez que un usuario inicia sesión y antes de que el dispositivo lo redirija a la página de inicio para conectarse usuarios.

¿Debo anular el SessionsController y, en caso afirmativo, cómo?


Devise proporciona el after_database_authentication devolución de llamada after_database_authentication. Usted tiene acceso completo para el objeto de usuario autenticado actual allí.

Si desea actualizar el nombre de usuario actual después de cada inicio de sesión exitoso, puede hacerlo como se muestra a continuación.

class User < ActiveRecord::Base devise :database_authenticatable def after_database_authentication self.update_attributes(:name => "your name goes here") end end


Si nos fijamos en la implementación de Devise de session_controller sessions_controller#create , notará que rinden si pasa un bloque.

Entonces, solo subclasifica sus controladores de sesión y pasa un bloque cuando llamas super. Para hacerlo, primero dile a Devise en routes.rb que te gustaría usar tu propio controlador de sesiones:

devise_for :users, controllers: { sessions: ''users/sessions'' }

Y luego crea una clase SessionsController y pasa un bloque cuando llamas a super en tu método de creación. Se vería algo como esto:

class Users::SessionsController < Devise::SessionsController layout "application" # POST /login def create super do |user| if user.persisted? user.update(foo: :bar) end end end end

La mayoría de los métodos del controlador Devise aceptan un bloque, por lo que podría hacer esto para el registro, la contraseña olvidada, etc. también.