【问题标题】:How to create a dynamic root in Rails 3?如何在 Rails 3 中创建动态根?
【发布时间】:2012-08-14 21:24:41
【问题描述】:
我的 web 应用中有管理员和普通用户。我想让他们的根(/)根据他们是谁而不同。可以从许多不同的页面访问根目录,因此如果我可以在 routes.rb 文件中实现这一点会容易得多。这是我当前的文件。
ProjectManager::Application.routes.draw do
root :to => "projects#index"
end
有人可以将我链接到一个可以告诉我前进方向的示例吗?有没有办法将逻辑放入路由文件中?感谢所有的帮助。
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
routing
【解决方案1】:
你可以只为根路由创建控制器。
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'
附:示例需要使用 Devise,但您可以根据需要对其进行自定义。
【解决方案2】:
有几个不同的选项:
1.路由文件中的 lambda(不是很随意)
previously explained
2。基于前过滤器的应用程序控制器中的重定向(这是最佳选择,但您的管理路由不会位于根目录)
来源rails guides - routing
您将有两条路线和两个控制器。例如,您可能有一个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
然后在你的布局文件夹中,添加一个名为admin.html.erb的文件
来源:rails guides - layouts and routing
【解决方案3】:
您无法真正动态地更改根,但有几种方法可以伪造它。
您想要的解决方案需要在您的应用程序控制器或“默认”根控制器中进行。最干净/最简单的解决方案就是让您的应用程序控制器重定向到仅针对该页面运行的 before 过滤器中的适当操作。然而,这将导致用户的 url 发生变化,他们将不再真正位于根目录。
您的第二个选择是让您指定为根的方法在您正在寻找的任何条件下呈现不同的视图。但是,如果这需要对逻辑进行任何重大更改,而不仅仅是加载单独的视图,那么您最好重定向。