Подтвердить что ты не робот

Rails - Как переопределить метод SessionController для выполнения определенных задач при входе пользователя?

Использование Devise для управления сеансами пользователей/регистрации Мне нужно будет выполнить определенные задачи (например, обновлять некоторые поля в таблице пользователей для этого конкретного пользователя) каждый раз, когда пользователь заходит, и до того, как он будет перенаправлен путем создания дома страница для подключенных пользователей.

Нужно ли мне переопределять метод SessionController, и если да, то как?

4b9b3361

Ответ 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 принимают блок, поэтому вы можете сделать это для регистрации, забыли пароль и т.д. Также.