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

时间:2012-08-14 21:24:41

标签: ruby-on-rails ruby-on-rails-3 routing

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

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

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

3 个答案:

答案 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(不是非常棘手)

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

然后在layouts文件夹中,添加一个名为admin.html.erb

的文件

来源:rails guides - layouts and routing

答案 2 :(得分:0)

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

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

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