从Rails中不同命名空间中的另一个控制器重定向/调用方法

时间:2016-03-18 01:43:10

标签: ruby-on-rails ruby model-view-controller devise cancancan

我有一个非常典型的情况,我有一个'/dashboard',它应该为不同的用户角色(即客户端,管理员等)呈现不同的视图。

我愿意接受更优雅的建议,但我的想法是为仪表板设置一个路径定义:

的routes.rb

resource :dashboard

并拥有 dashboards_controller.rb ,如下所示:

class DashboardsController < ApplicationController
  def show
    if current_user.has_role?('sysadmin')
      // show system admin dashboard
    elsif
      // show a different dashboard

    // etc
    end
  end
end

现在我希望每个仪表板都在其角色特定的命名空间dashboard_controller中构建,例如:controllers/admin/dashboard_controller.rb。这样,每个仪表板都可以在适当的位置适当地构建。

我尝试这样做的方法是从我的主要dashboards_controller重定向到admin/dashboard_controller,如下所示:

redirect_to :controller => 'admin/dashboard_controller', :action => 'index'

但它不起作用,大概是因为我不确定如何从这里引用命名空间控制器。

我怎样才能做到这一点?

(如果有一个更优雅的解决方案我是开放的,但我认为这是非常好的。)

我正在使用装饰和cancancan。

2 个答案:

答案 0 :(得分:1)

您可以执行每个角色的信息中心,例如:

<强>的routes.rb

scope '/:role' do
  resources :dashboard
end

resources :dashboard

然后使用角色重定向,只需:

redirect_to :controller => 'dashboard', :action => 'index', :role => 'admin'

更好的方式

如果要为每个控制器自定义调度,则应考虑使用过滤器。例如。只有管​​理员可以访问admin/dashboard且默认用户只能访问user/dashboard,您可能需要创建如下文件:

<强>的routes.rb

namespace 'admin' do
  resources :dashboard
end

namespace 'user' do
  resources :dashboard
end

然后你创建这些文件:

app/controllers/admin/dashboards_controller.rb
app/controllers/admin/admin_base_controller.rb
app/controllers/user/dashboards_controller.rb
app/controllers/user/user_base_controller.rb

对于每个文件:

# app/controllers/admin/dashboards_controller.rb
class Admin::DashboardsController < Admin::AdminBaseController; end

# app/controllers/admin/admin_base_controller.rb
class Admin::AdminBaseController < ApplicationController
  before_action :ensure_admin!

  def ensure_admin!
    redirect_to controller: 'user/dashboards', action: index unless current_user.has_role?('sysadmin')
  end
end

# Now you've got the idea. Similar things for the rest of the files:
# app/controllers/user/dashboards_controller.rb
# app/controllers/user/user_base_controller.rb

然后您可以尝试在admin/dashboardsuser/dashboards访问它,相应地将其重定向到其角色。

答案 1 :(得分:1)

使用命名路由助手而不是明确提供控制器和操作是很好的。

考虑按如下方式添加路线:

namespace :admin do
  resource :dashboard, controller: 'dashboard '
end

然后你可以打电话:

redirect_to admin_dashboard_url

请记住,它的资源,而不是资源。所以它将处理dashboard_controller#show,而不是dashboard_controller #index