Rails,Active Admin,Devise,路由

时间:2016-03-24 12:28:08

标签: ruby-on-rails ruby devise routes cancancan

我一直在使用Rails,Active Addmin和cancancan。除了一件事,一切都很好。最近,我为管理员类型用户和客户端添加了单独的命名空间。

在更改之前,我以这种方式将所有经过身份验证的用户重定向到相同的活动管理信息中心(routes.rb):

  devise_scope :user do
    authenticated :user do  
        root :to => 'admin/dashboard#index', as: :authenticated_root
    end
    unauthenticated :user do
      root :to => 'pages#index', as: :unauthenticated_root
    end
  end

目前,我需要以某种方式添加其他条件,以检查经过身份验证的用户是否具有 admin 客户端的角色。

我的想法是这样做:

devise_scope :user do
    authenticated :user do 
      if current_user.role?(:Architect) || current_user.role?(:Admin) 
        root :to => 'admin/dashboard#index', as: :authenticated_root
      else 
        root :to => 'clients/dashboard#index', as: :authenticated_client
      end
    end
    unauthenticated :user do
      root :to => 'pages#index', as: :unauthenticated_root
    end
  end

但我收到错误:未定义的局部变量或方法`current_user' 有人知道如何检查用户在路线中的角色吗?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

页面控制器:

class PageController < ApplicationController

  before_filter :check_route, :only => [:index]

  def check_route
    return unless user_signed_in?
    if current_user.role?(:Architect) || current_user.role?(:Admin)
      redirect_to :controller => 'admin/dashboard', :action => 'index'
    else
      redirect_to :controller => 'clients/dashboard', :action => 'index'
    end
  end
end

routes.rb中:

root :to => 'pages#index', as: :unauthenticated_root

答案 1 :(得分:0)

root是一个负责路由定义的配置文件,你不能访问配置文件中的任何会话变量。

如果您想在登录后重定向用户,可以使用after_sign_in_path_for中的Devise::SessionsController方法

class SessionsController < Devise::SessionsController

    def after_sign_in_path_for(resource)
        if resource.role?(:Architect) || resource.role?(:Admin) 
            authenticated_root_url
        else
            authenticated_client_url
        end 
    end
end

在您的路线中,您需要指明自定义sessions_controller

devise_for :user, :controllers => {:sessions => "sessions"}