设计 - after_sign_out_path_for - 取决于用户属性

时间:2015-05-21 10:59:26

标签: ruby-on-rails-3 devise

在早期版本的Devise(3.2)中,可以访问刚刚在after_sign_out_path_for(resource)方法中注销的用户,并根据该用户的任何给定属性进行重定向。

在Devise 3.4中,方法after_sign_out_path_for(resource_or_scope)只接收类名作为参数resource_or_scope的符号,即在我的情况下为:user

根据用户模型中属性的值,还有其他方法可以在注销后重定向给定用户吗?

澄清一下:我不打算为此工作创建不同的用户类。

3 个答案:

答案 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

当然,你真的不需要覆盖注销方法,你可以简单地使用

  

config.sign_out_all_scopes = false in devise.rb

答案 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"}