使用Devise,如何有两个authenticated_root(针对两个不同的用户模型)

时间:2017-02-01 20:53:15

标签: ruby-on-rails devise

My Rails 5应用程序使用Devise 4.2处理管理员和代理用户类型(单独的表)的身份验证。除了让登录的管理员与代理

的根目录不同之外,它一切正常

在routes.rb中,我可以将authenticated_root设置为:admin OR:user,但同时执行这两项操作(如下所示)会导致应用程序启动时出错:ArgumentError: Invalid route name, already in use: 'authenticated_root'

似乎Rails忽略了authenticated_root的两种用法发生在两种不同的场景中。

# routes.rb
devise_for :agents, :skip => [:registrations]
as :agent do
  get 'agents/edit' => 'devise/registrations#edit', :as => 'edit_agent_registration'    
  put 'agents' => 'devise/registrations#update', :as => 'agent_registration'            
end  

devise_for :admins, :skip => [:registrations]  
as :admin do
  get 'admins/edit' => 'devise/registrations#edit', :as => 'edit_admin_registration'    
  put 'admins' => 'devise/registrations#update', :as => 'admin_registration'            
end  

authenticated :admin do
  root 'pages#adminhome', as: :authenticated_root
end
authenticated :agent do
  root 'pages#agenthome', as: :authenticated_root
end

我是否应该使用某种lambda来设置authenticated_root而不是记录的常规方法,并在上面使用?

我尝试了这种方法,但得到了同样的错误:

root :to => 'pages#adminhome', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Admin' }, as: :authenticated_root
root :to => 'pages#agenthome', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Agent' }, as: :authenticated_root

1 个答案:

答案 0 :(得分:1)

我删除了“as :: authenticated_root”部分,它运行正常。我在轨道5.0.2上。

下面的链接说“as :: authenticated_root”部分是必要的,因为rails 4不允许具有相同名称的路由,假设您已经定义了根路由。

Different '/' root path for users depending if they are authenticated (using devise)