设计为每个用户类型设置不同的根路径

时间:2012-11-06 17:44:58

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

我已经创建了一个设计用户模型。有两种类型的用户:

  • 客户
  • 管理员

我已经完成了bij,创造了两个正常的'模特:客户和管理员。这两个模型继承自用户模型,如下所示:

class Customer < User

有谁知道如何为每种类型的用户设置根路径。我想要这样的东西:

authenticated :customer do
  root :to => "customer/dashboard#index"
end

authenticated :admin do
  root :to => "admin/dashboard#index"
end    

更新:

我已经解决了这个问题:

root :to => "pages#home", :constraints => lambda { |request|!request.env['warden'].user}
root :to => 'customer/dashboard#index', :constraints => lambda { |request| request.env['warden'].user.type == 'customer' }
root :to => 'admin/dashboard#index', :constraints => lambda { |request| request.env['warden'].user.type == 'admin' }

3 个答案:

答案 0 :(得分:6)

虽然是一个老问题,但没有答案,它可能对其他人有用。

在rails 3.2中(我从未测试过任何更低版本)你可以在routes.rb文件中执行此操作

authenticated :admin_user do
  root :to => "admin_main#index"
end

然后让你的正常根路线进一步下降。

然而,这似乎不适用于rails 4,因为它提供了Invalid route name, already in use: 'root' (ArgumentError)(正如我刚刚发现的那样,当我遇到这个问题时正在寻找解决方案),如果我找到一种方法在rails 4中这样做我会更新我的答案

编辑:

好吧,对于rails 4来说,修复非常简单但不是那么明显。您需要做的就是通过添加as:将第二个根路由作为命名路由:像这样:

authenticated :admin_user do
  root :to => "admin_main#index", as: :admin_root
end

这是记录here,但请注意,它似乎只是一个临时修复,因此将来会再次发生变化

答案 1 :(得分:2)

您可以做的是拥有一个根路径,比如home#index,并在相应的控制器操作中根据用户类型执行重定向。

例如:

def index
  if signed_in?
    if current_user.is_a_customer?
      #redirect to customer root
    elsif current_user.is_a_admin?
      #redirect to admin root
    end
  end
end

答案 2 :(得分:0)

使用after_sign_in_path_for应该是合适的。请将此添加到您的application_controller.rb

def after_sign_in_path_for(resource)
  if resource.type == 'customer'
    your_desired_customer_path
  else
    your_desired_admin_path
  end
end