2012-08-14 50 views
5

我有我的webapp中的管理員和普通用戶。我想讓他們的根(/)取決於他們是誰。根可以從多個不同的頁面訪問,所以如果我可以在routes.rb文件中實現這一點,它會容易得多。這是我目前的檔案。如何在Rails 3中創建動態根?

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

有人可以請我鏈接到一個例子,可以告訴我的方向去?有什麼方法可以將邏輯放入路徑文件中嗎?感謝所有的幫助。

回答

0

你不能真正地動態改變根目錄,但有幾種方法可以僞裝它。

您想要的解決方案需要在您的應用程序控制器或「默認」根控制器中進行。最簡潔/最簡單的解決方案只是讓您的應用程序控制器重定向到僅針對該頁面運行的before過濾器中的相應操作。這會導致用戶的網址發生變化,但是,它們不會真正成爲根源。

你的第二個選擇是讓你指定的root方法在你想要的任何條件下呈現不同的視圖。但是,如果這需要在邏輯上進行重大更改而不是簡單地加載單獨的視圖,那麼最好是重定向。

2

有幾種不同的選擇:

1路由文件拉姆達(不是很railsy)

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

5

您可以只創建控制器根路徑。

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,但您可以根據需要對其進行自定義。