2016-05-06 52 views
0

我正在一个应用程序中有一个模型用户与角色成员和管理员。有条件的路线在sign_out上使用设计与Rails

按照要求,我必须为管理员和成员制作两个单独的登录页面。

http://localhost:3000/admin/admin_login

它去管理登录页面,并与

http://localhost:3000/users/sign_in

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

但在注销两者的时间去 http://localhost:3000

但我想管理员去http://localhost:3000/admin/admin_login, 而http://localhost:3000是罚款会员注销。

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

+0

您如何知道用户是管理员或成员?你有没有在数据库中设置任何属性? –

+0

我已经使用rolify宝石。 与current_user.has_role? :管理员,我可以检查他们,但在哪里检查这与设计 –

回答

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

+0

以及如何检查角色在这里,resource.has_role? :管理员发出错误 –

+0

请参阅发送到after_sign_out_path_for的参数。 'resource_or_scope'是那里的变量。你正在检查resource.has_role ?.你需要检查'resource_or_scope.has_role? :管理“..或你有设置资源? –

+0

不,我没有设置资源,让我看看这个 –

1

我想你可以这样试试 只需保存你想在sign_out之后重定向用户的任何路径,然后根据登录后的角色在会话中使用该会话并在尾部使用该会话er_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 
+0

谢谢你,但我试过这个类似的解决方案,似乎他们设计注销清除所有会话 –

+0

其他解决方案适合你@shadow答案? – Thorin

+0

@shadow解决方案适合你,我没有测试过我的解决方案,只是添加了基于知识的代码,是的,你是正确的设备删除登出所有会话 – Thorin

0

是他们点击管理员和用户不同的注销链接的网页从那里重定向用户?如果是这样,您可以检查after_sign_out_path方法中的request.referrer属性并相应地进行路由。

如果您在登录后将它们路由到正确的页面,那么为什么您需要单独的登录页面?您可能只想简单地使用一个登录页面。