Pat*_*rre 40 ruby-on-rails devise
使用Devise管理用户会话/注册我需要每次用户登录时,以及在通过设计重定向到主页以进行连接之前执行特定任务(例如,更新此特定用户的users表中的某些字段)用户.
我是否必须覆盖设计SessionsController,如果是,如何?
Pyk*_*kih 61
或者,您可以创建自己的会话控制器
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
Run Code Online (Sandbox Code Playgroud)
另外routes.rb:
devise_for :users, controllers: {sessions: "sessions"}
Run Code Online (Sandbox Code Playgroud)
Sou*_*amy 18
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
Run Code Online (Sandbox Code Playgroud)
ste*_*son 15
如果你看一下设计的实现中sessions_controller#create,你会发现,它们产生,如果你传递一个块.
因此,只需将其会话控制器子类化,并在调用super时传递一个块.要做到这一点,首先告诉Devise routes.rb你想使用自己的会话控制器:
devise_for :users, controllers: { sessions: 'users/sessions' }
Run Code Online (Sandbox Code Playgroud)
然后SessionsController在create方法中调用super时创建一个类并传递一个块.它看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
大多数Devise控制器方法接受一个块,所以你可以这样做注册,忘记密码等.
| 归档时间: |
|
| 查看次数: |
39752 次 |
| 最近记录: |