Rails - Как переопределить метод SessionController для выполнения определенных задач при входе пользователя?
Использование Devise для управления сеансами пользователей/регистрации Мне нужно будет выполнить определенные задачи (например, обновлять некоторые поля в таблице пользователей для этого конкретного пользователя) каждый раз, когда пользователь заходит, и до того, как он будет перенаправлен путем создания дома страница для подключенных пользователей.
Нужно ли мне переопределять метод SessionController, и если да, то как?
Ответы
Ответ 1
В качестве альтернативы вы можете создать свой собственный контроллер сеансов
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
И в маршрутах добавьте
devise_for :users, controllers: {sessions: "sessions"}
Ответ 2
Devise предоставляет метод обратного вызова after_database_authentication. У вас есть полный доступ для текущего объекта аутентифицированного пользователя.
Если вы хотите обновить текущее имя пользователя после каждого успешного входа в систему, вы можете сделать это, как показано ниже.
class User < ActiveRecord::Base
devise :database_authenticatable
def after_database_authentication
self.update_attributes(:name => "your name goes here")
end
end
Ответ 3
Если вы посмотрите Разработать реализацию sessions_controller#create
, вы заметите, что они дают, если вы передаете блок.
Итак, просто подкласс их контроллеров сессий и передать блок, когда вы вызываете супер. Для этого сначала сообщите разработчику в routes.rb
, что вы хотите использовать собственный контроллер сеансов:
devise_for :users, controllers: { sessions: 'users/sessions' }
И затем создайте класс SessionsController
и передайте блок, когда вы вызываете super в вашем методе создания. Он будет выглядеть примерно так:
class Users::SessionsController < Devise::SessionsController
layout "application"
# POST /login
def create
super do |user|
if user.persisted?
user.update_attributes(foo: :bar)
end
end
end
end
Большинство методов контроллера Devise принимают блок, поэтому вы можете сделать это для регистрации, забыли пароль и т.д. Также.