29

我正在开发一个项目管理应用程序,在该应用程序中,我有project_managersclients。我正在使用 Devise 和 CanCan 进行身份验证/授权。

登录后什么时候应该将用户重定向到他们自己的特定控制器/布局/视图?有没有办法根据他们是项目经理还是客户来检查current_user.role并设置根(或重定向)?routes.rb这是我可以在 Devise 的某个地方做出的改变吗?

提前感谢您的帮助! - 标记

4

5 回答 5

41

您的routes.rb文件不知道用户具有什么角色,因此您将无法使用它来分配特定的根路由。

你可以做的是设置一个控制器(例如,passthrough_controller.rb),它反过来可以读取角色并重定向。像这样的东西:

# passthrough_controller.rb
class PassthroughController < ApplicationController
  def index
    path = case current_user.role
      when 'project_manager'
        some_path
      when 'client'
        some_other_path
      else
        # If you want to raise an exception or have a default root for users without roles
    end

    redirect_to path     
  end
end

# routes.rb
root :to => 'passthrough#index'

这样,所有用户都将拥有一个入口点,这反过来又根据他们的角色将他们重定向到适当的控制器/操作。

于 2011-01-20T23:36:14.567 回答
21

另一种选择是将 proc 传递给这样的authenticated方法(我在此示例中使用 rolify):

authenticated :user, ->(u) { u.has_role?(:manager) } do
  root to: "managers#index", as: :manager_root
end

authenticated :user, ->(u) { u.has_role?(:employee) } do
  root to: "employees#index", as: :employee_root
end

root to: "landing_page#index"

请注意,在 Rails 4 中,您必须为每个根路由指定一个唯一名称,有关详细信息,请参阅此问题

于 2014-02-02T17:14:15.630 回答
19

最简单的解决方案是使用lambda

root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
root :to => 'clients#index'
于 2012-08-03T11:14:01.007 回答
8

我在使用 Warden 的 Rails 3 应用程序中执行此操作。由于 Devise 是建立在 Warden 之上的,我认为它会为您工作,但请务必在依赖它之前对其进行一些试验。

class ProjectManagerChecker
  def self.matches?(request)
    request.env['warden'].user.role == 'project_manager'
  end
end

# routes.rb
get  '/' => 'project_managers#index', :constraints => ProjectManagerChecker
get  '/' => 'clients#index'

如果用户的角色是“project_manager”,则将使用 ProjectManagersController - 如果不是,将使用 ClientsController。如果他们根本没有登录,env['warden'].user将为 nil 并且你会得到一个错误,所以你可能想要解决这个问题,但这会让你开始。

于 2011-01-21T00:02:39.687 回答
3

博客文章与实施http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/

于 2011-10-24T09:40:48.030 回答