我有一个非常典型的情况,我有一个'/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。
答案 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/dashboards
和user/dashboards
访问它,相应地将其重定向到其角色。
答案 1 :(得分:1)
使用命名路由助手而不是明确提供控制器和操作是很好的。
考虑按如下方式添加路线:
namespace :admin do
resource :dashboard, controller: 'dashboard '
end
然后你可以打电话:
redirect_to admin_dashboard_url
请记住,它的资源,而不是资源。所以它将处理dashboard_controller#show,而不是dashboard_controller #index