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.