46

每次用户登录时,以及在他被设计重定向到主页以进行连接之前,我都需要使用 Devise 管理用户会话/注册用户。

我是否必须重写设计 SessionsController,如果是,如何?

4

3 回答 3

71

或者,您可以创建自己的会话控制器

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

routes.rb添加:

devise_for :users, controllers: {sessions: "sessions"}
于 2012-12-12T10:39:51.480 回答
24

如果您查看Devise 的 实现sessions_controller#create您会注意到如果您传递一个块,它们就会屈服。

因此,只需将它们的会话控制器子类化并在调用 super 时传递一个块。为此,首先告诉 Deviseroutes.rb您想使用自己的会话控制器:

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

然后SessionsController在 create 方法中调用 super 时创建一个类并传递一个块。它看起来像这样:

# app/controllers/users/sessions_controller.rb

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

大多数设计控制器方法都接受一个块,因此您也可以这样做以进行注册、忘记密码等。

于 2016-01-15T17:56:30.390 回答
19

设计提供after_database_authentication回调方法。您可以完全访问那里的当前经过身份验证的用户对象。

如果您想在每次成功登录后更新当前用户名,您可以执行以下操作。

class User < ActiveRecord::Base
  devise :database_authenticatable

  def after_database_authentication
    self.update_attributes(:name => "your name goes here")
  end 
end
于 2012-12-12T09:57:25.637 回答