我如何使用Rails和Devise重定向到不同的注销路径

时间:2012-03-26 11:55:06

标签: ruby-on-rails devise

我正在使用rails3和gem devise,我有两个角色admin和customer,我想要用户

退出管理员应该重定向到不同的路径,客户应该重定向到不同的路径

退出时..

3 个答案:

答案 0 :(得分:3)

您可以在sign_out路径后使用设计方法获得所需的功能。

但在应用程序助手中定义这些方法之前。

def is_admin?(user)
  admin_role = Role.find(:first, :conditions => ["name = ?", "admin"])
  return user.roles.include?(admin_role)
end


def is_customer?(user)
  admin_role = Role.find(:first, :conditions => ["name = ?", "customer"])
  return user.roles.include?(admin_role)
end

之后在应用程序控制器中包含应用程序帮助程序并定义此方法

def after_sign_out_path_for(resource_or_scope)
  if is_admin?(current_user)
    home_path = "/admin/users/sign_in"
  elsif is_customer?(current_user)
    home_path = "/customer"
  end
    respond_to?(home_path, true) ? send(root_path) : home_path

希望它能正常工作!!!

答案 1 :(得分:2)

您可以覆盖设计使用的 after_sign_out_path_for(资源)方法。在检查用户在方法中的角色后,只需提及逻辑或仅提供所需的重定向路径。设计会话的销毁操作通过此方法调用重定向路径。

def after_sign_out_path_for(resource)
  #logic
end

希望这有用..

答案 2 :(得分:0)

Devise README介绍了如何设置自定义路由和控制器。简而言之,您需要为每个型号定制路线,例如:

devise_for :admins,    :controllers => { :sessions => "admins/sessions" }
devise_for :customers, :controllers => { :sessions => "customers/sessions" }

然后创建相应的控制器并覆盖Devise::SessionsController#destroy,例如:

class Admins::SessionsController < Devise::SessionsController
  def destroy
    super

    redirect_to ...
  end
end