在早期版本的Devise(3.2)中,可以访问刚刚在after_sign_out_path_for(resource)
方法中注销的用户,并根据该用户的任何给定属性进行重定向。
在Devise 3.4中,方法after_sign_out_path_for(resource_or_scope)
只接收类名作为参数resource_or_scope
的符号,即在我的情况下为:user
。
根据用户模型中属性的值,还有其他方法可以在注销后重定向给定用户吗?
澄清一下:我不打算为此工作创建不同的用户类。
答案 0 :(得分:0)
前一段时间我遇到了完全相同的问题,我无法以干净的方式找到方法。所以为了解决这个问题,我只是简单地设计了一个SessionsController,我将在会话中保存所需的属性,然后Devise将其删除:
class SessionsController < Devise::SessionsController
def sign_out
company_slug = session[:company_slug]
super
session[:company_slug] = company_slug
end
end
然后在我的after_sign_out_path_for上,我可以这样做:
def after_sign_out_path_for(resource_or_scope)
if session[:company_slug] == 'something'
something_path
end
end
当然,你真的不需要覆盖注销方法,你可以简单地使用
答案 1 :(得分:0)
感谢您指点我正确的方向。你的答案确实需要在实际工作之前进行一些调整。
实际覆盖的方法是destroy
(不是sign_out
)。当我使用super
调用它时,它仍然无效,因为原始会话控制器在设置after_sign_out_path_for
之前重定向到session[:nosponsor]
。所以我不得不覆盖整个方法。
class SessionsController < Devise::SessionsController
def destroy
nosponsor = current_user && current_user.sponsor.blank?
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
set_flash_message :notice, :signed_out if signed_out && is_flashing_format?
yield if block_given?
session[:nosponsor] = "true" if nosponsor
respond_to do |format|
format.all { head :no_content }
format.any(*navigational_formats) { redirect_to after_sign_out_path_for(resource_name) }
end
end
end
此外,为了实现这一点,需要在routes.rb
devise_for :users, :controllers => {:sessions => "sessions"}
我想为您的答案给予肯定。因此,如果您更新它以包含这些更改,我将接受它作为正确的更改。再一次。
答案 2 :(得分:0)
我有同样的需求,我采取了不同的方法(因为注销的行为会清除你的会话) - 使用实例变量代替会话来存储用户
class SessionsController < Devise::SessionsController
def destroy
@user = current_user
super
end
end
class ApplicationController < ActionController::Base
def after_sign_out_path_for(resource)
if @user.some_method?
path_a
else
path_b
end
end
end
当然,在config/routes.rb
devise_for :users, controllers: {sessions: "sessions"}