如何在Rails 3中创建动态根?

我的webapp中有管理员和普通用户。 我想根据他们的身份使他们的根(/)不同。 从许多不同的页面访问根,因此如果我能在routes.rb文件中实现这一点会容易得多。 这是我当前的文件。

ProjectManager::Application.routes.draw do root :to => "projects#index" end 

有人可以把我链接到一个可以告诉我进入方向的例子吗? 有没有办法将逻辑放入路径文件? 谢谢你的帮助。

您只需为根路由创建控制器即可。

 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' 

PS示例期望使用Devise ,但您可以根据需要自定义它。

有几个不同的选择:

1.路由文件中的lambda(不是很邋y)

之前解释过

2.基于前置filter的应用程序控制器中的重定向(这是最佳的,但您的管理路由不在根目录下)

源rails指南 – 路由

你会有两条路线和两个控制器。 例如,您可能有一个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的文件

source: rails指南 – 布局和路由

你无法真正动态地更改根,但有几种方法可以伪造它。

您需要的解决方案需要在应用程序控制器或“默认”根控制器中进行。 最干净/最简单的解决方案就是让您的应用程序控制器重定向到仅针对该页面运行的beforefilter中的相应操作。 然而,这会导致用户的url发生变化,而且他们不再真正处于根源。

您的第二个选择是让您指定为root的方法在您要查找的任何条件下呈现不同的视图。 但是,如果这需要逻辑上的任何重大更改,而不仅仅是加载单独的视图,那么最好不要重定向。