我的网络应用中有管理员和普通用户。我想根据他们的身份使他们的根(/)不同。从许多不同的页面访问根,因此如果我能在routes.rb文件中实现这一点会容易得多。这是我当前的文件。
ProjectManager::Application.routes.draw do
root :to => "projects#index"
end
有人可以将我链接到一个可以告诉我进入方向的示例吗?有没有办法将逻辑放入路径文件?谢谢你的帮助。
答案 0 :(得分:6)
您可以为根路由创建控制器。
class RoutesController < ActionController::Base
before_filter :authenticate_user!
def root
root_p = case current_user.role
when 'admin'
SOME_ADMIN_PATH
when 'manager'
SOME_MANAGER_PATH
else
SOME_DEFAULT_PATH
end
redirect_to root_p
end
end
在您的routes.rb中:
root 'routes#root'
P.S。示例期望使用Devise,但您可以根据需要对其进行自定义。
答案 1 :(得分:2)
有几种不同的选择:
<强> 1。路线文件中的lambda(不是非常棘手)
<强> 2。应用程序控制器中的重定向基于前置过滤器(这是最佳的,但您的管理路由不在根域)
你将有两条路线和两个控制器。例如,您可能有HomeController
,然后是AdminController
。其中每个都有index
个动作。
您的config/routes.rb
文件将
namespace :admin do
root to: "admin#index"
end
root to: "home#index"
命名空间方法为您提供/admin
的路线,并且'/'
可以访问常规根
然后是安全的;在你的管理员控制器中添加一个before_filter来重定向任何非管理员,在你的家庭控制器中你可以重定向任何管理员用户。
第3。根据用户角色动态更改布局。
在根目录所在的同一个控制器中,添加一个更改布局的辅助方法。
layout :admin_layout_filter
private
def admin_layout_filter
if admin_user?
"admin"
else
"application"
end
end
def admin_user?
current_user.present? && current_user.admin?
end
然后在layouts文件夹中,添加一个名为admin.html.erb
答案 2 :(得分:0)
你无法真正动态地更改根目录,但有几种方法可以伪造它。
您需要的解决方案需要在应用程序控制器或“默认”根控制器中进行。最干净/最简单的解决方案就是让您的应用程序控制器重定向到仅针对该页面运行的before过滤器中的相应操作。但是,这将导致用户的网址发生变化,并且他们将不再真正处于根源。
您的第二个选择是让您指定为root的方法在您要查找的任何条件下呈现不同的视图。但是,如果这需要逻辑上的任何重大改变,而不仅仅是加载一个单独的视图,那么你最好不要重定向。