【问题标题】:Conditional Route on sign_out using Devise with Rails使用带 Rails 的 Devise 对 sign_out 进行条件路由
【发布时间】:2016-09-01 12:11:23
【问题描述】:

我正在开发一个应用程序,其中有一个模型 User 具有角色 member 和 Admin。

根据要求,我必须为管理员和会员制作两个单独的登录页面。

http://localhost:3000/admin/admin_login

它进入管理员登录页面并使用

http://localhost:3000/users/sign_in

进入会员登录页面。 登录后,我会根据他们的角色将他们路由到管理面板或简单的会员网站。

但在注销时两者都转到 http://localhost:3000

但我希望管理员转到http://localhost:3000/admin/admin_login, 而http://localhost:3000 可以用于会员注销。

有没有办法在注销时查看用户的角色并相应地路由它们。

【问题讨论】:

  • 你怎么知道用户是管理员还是会员。您在数据库中设置了任何属性吗?
  • 我用过 rolify gem。与 current_user.has_role? :管理员,我可以检查它们,但是在哪里用设计检查这个

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

您可以根据应用程序控制器中的资源定义注销后路径..

class ApplicationController < ActionController::Base
  private

  # Overwriting the sign_out redirect path method
  def after_sign_out_path_for(resource_or_scope)
    root_path
  end
end

after_sign_out_for_for 方法中,您可以检查用户角色并重定向到

更多详情请访问设计维基After Sign out path in devise

【讨论】:

  • 以及如何在这里查看角色,resource.has_role? :Admin 出错
  • 请参阅发送到 after_sign_out_path_for 的参数。 resource_or_scope 是那里的变量。你正在检查 resource.has_role?。你需要检查resource_or_scope.has_role? :Admin..或者你已经设置了资源?
  • “resource_or_scope”也有同样的问题
  • after_sign_out_path_for 收到的是符号,而不是记录 - 您将无法访问刚刚注销的用户记录。方法见文档注释:github.com/plataformatec/devise/blob/master/lib/devise/…
  • 我不确定.. 并且没有使用 rolify gem 和设计但试图帮助你.. 你试过这个吗....def after_sign_out_path_for current_user.has_role? :Admin end
【解决方案2】:

我觉得你可以这样试试 只需在登录会话后根据角色在登录后保存您想要重定向用户的任何路径,并在 after_sign_out_path_for 方法中使用该会话

after_filter :store_location

def store_location
  return unless session[:login_url].blank? 
  session[:login_url] = current_user.admin? ? admin_path : other_user_path
end

def after_sign_out_path_for(resource) 
  session[:login_url] || request.referer || root_path
end

还有另一种方法只是覆盖设计 sessoin 控制器并根据角色从那里重定向用户

# routes.rb
devise_for :users, :controllers => { :sessions => "sessions" } # etc

# sessions_controller.rb
class SessionsController < Devise::SessionsController

  def destroy
    #login_path = set path in a variable based on user role before sing_out
    #code to sign out 
    #
   redirect_to login_path
  end

end

【讨论】:

  • 谢谢,但我尝试了这种类型的解决方案,似乎他们设计注销清除了所有会话
  • @shadow 解决方案适合您,我没有测试我的解决方案,只是根据知识添加了代码,是的,您是正确的设备,在注销时删除所有会话
  • 不,Shadow 解决方案也不起作用,因为当时我只是以 resource_or_scope 而不是用户对象的形式有一个用户符号。所以无法检查角色
  • 管理员可以访问那些其他用户无法访问的页面?
  • 我认为您只是将用户从他们注销的页面重定向到最后一页,它会将用户重定向回他们的登录页面
【解决方案3】:

对于管理员和用户来说,他们点击注销链接的页面是否不同?如果是这样,您可以在 after_sign_out_path 方法中检查 request.referrer 属性并相应地进行路由。

顺便说一句,如果您在登录后将它们路由到正确的页面,那么为什么需要单独的登录页面?为简单起见,您可能只想拥有一个登录页面。

【讨论】:

    【解决方案4】:

    你也可以留下config.sign_out_via =: get =&gt; config/initializers/devise.rb不是最好的方法,但为我解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多