我的 webapp 中有管理员和普通用户。我想让他们的根(/)根据他们是谁而不同。可以从许多不同的页面访问根目录,因此如果我可以在 routes.rb 文件中实现这一点会容易得多。这是我当前的文件。
ProjectManager::Application.routes.draw do
root :to => "projects#index"
end
有人可以将我链接到一个可以告诉我前进方向的例子吗?有没有办法将逻辑放入路由文件中?感谢所有的帮助。
我的 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(不是很随意)
2. 基于前置过滤器在应用程序控制器中重定向(这是最佳选择,但您的管理路由不会位于根目录)
您将有两条路线和两个控制器。例如,您可能有一个HomeController
,然后是一个AdminController
。每一个都会有一个index
动作。
你的config/routes.rb
文件会有
namespace :admin do
root to: "admin#index"
end
root to: "home#index"
命名空间方法为您提供了一个路由,/admin
并且常规根可以在'/'
然后是安全的;在您的管理控制器中添加一个 before_filter 来重定向任何非管理员,并且在您的家庭控制器中,您可以重定向任何管理员用户。
3.根据用户角色动态改变布局。
在您的 root 将要访问的同一控制器中,添加一个更改布局的辅助方法。
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
然后在您的布局文件夹中,添加一个名为admin.html.erb
您不能真正动态地更改根,但有几种方法可以伪造它。
您想要的解决方案需要在您的应用程序控制器或“默认”根控制器中进行。最干净/最简单的解决方案就是让您的应用程序控制器重定向到仅针对该页面运行的 before 过滤器中的适当操作。然而,这将导致用户的 url 发生变化,并且他们将不再真正位于根目录。
您的第二个选择是让您指定为根的方法在您正在寻找的任何条件下呈现不同的视图。但是,如果这需要对逻辑进行任何重大更改,而不仅仅是加载单独的视图,那么您最好重定向。