2010-07-11 89 views
4

我正在研究一個有相關模型的應用程序,並希望聽到關於如何最好地組織控制器的一些意見。如何在中等大小的Rails應用程序中組織控制器?

以下是我一直在考慮的一些選項:

1)命名空間控制器。所以,例如,有一個controllers/admin目錄和一個controllers/public目錄。這對於組織來說似乎很有吸引力,但也是一種製作方式,因爲單個資源通常可能具有可能合理地屬於不同目錄的操作(例如,顯示操作是公開的,而創建操作是管理員)。所以這意味着將我的一些資源分解爲兩個獨立的控制器 - 一個公共的,一個管理員。似乎不好。

2)創建嵌套資源。我只是偶爾使用嵌套的資源,所以對於我來說,最好是嵌套資源,而不是明確地傳遞所需的數據。有沒有人有一些關於如何最好地使用嵌套資源的建議/例子?什麼時候是個好主意?什麼時候它是一種矯枉過正?

3)只保留默認的腳手架控制器。根據需要在過濾器之前創建新的收集/成員操作,以便在每個控制器中設置權限。這看起來最吸引人,因爲它使事情變得簡單。但是我對事情變得混亂感到緊張,因爲一些控制者可能會開始因爲一些新的行爲而臃腫。

如果任何有設計大型應用程序經驗的人都可以在這裏提供一些指導,那將不勝感激。

回答

5

爲了在我們的應用程序中進行組織,我根據情況完成了一切。

首先,關於管理員/用戶功能的單獨控制器,我會說你可能不想走那條路線。我們使用授權和before_filter來管理應用程序中的權限。我們推出了自己的,但20/20後視,我們應該使用CanCan。從那裏,你可以設置這樣的事情(這是僞代碼,實際的語言將取決於你如何實現授權):

before_filter :can_edit_user, :only => [:new, :create, :edit, :update] #or :except => [:index, :show] 

protected 

def can_edit_user 
    redirect_to never_never_land_path unless current_user.has_rights?('edit_user') 
end 

或者在更高層次上

before_filter :require_admin, :only [:new, :create] 

,並在您的應用程序控制器

def require_admin 
    redirect_to never_never_land_path unless current_user.administrator? 
end 

這將取決於哪條路線,但我會用它來進行授權而不是分割控制器。

至於名稱空間與嵌套資源,它取決於情況。在我們的幾款應用中,我們都有。當存在邏輯分隔的原因時,我們使用名稱空間,或者在一組控制器之間會有共享的功能。我們的案例和要點是我們將管理功能放在名稱空間內,並且在我們的用戶,角色和其他專有管理功能中。

map.namespace :admin do |admin| 
    admin.resources :users 
    admin.resources :roles 
end 

然後在這些控制器中我們有一個基礎控制器,它存儲我們的共享函數。

class Admin::Base < ApplicationController 
    before_filter :require_admin 
end 

class Admin::UsersController < Admin::Base 
    def new 
    .... 
end 

這爲我們提供數據的邏輯分離,並通過共享之類的before_filter乾涸我們的代碼位的能力。

我們使用嵌套的控制器,如果將要有一段代碼,你想在控制器之間持續一些東西。我們的應用案例是我們的客戶。我們搜索並加載一個客戶,然後在該客戶內部,他們有訂單,門票,地點。在這個區域內,我們在查看不同標籤的同時加載了客戶。

map.resources :customers do |customer| 
    customer.resources :tickets 
    customer.resources :orders 
    customer.resources :locations 
end 

,並給我們的網址:我們從這個經歷

customers/:id 
customers/:customer_id/orders/:id 
customers/:customer_id/tickets/:id 

其他優點是易於設置的菜單系統和標籤。這些結構適合於有組織的網站。

我希望這有助於!

+0

太棒了。這正是我需要的。我特別喜歡使用名稱空間並從基本控制器繼承的想法。 此外,我沒有考慮使用CanCan,但我一定會檢查出來。 謝謝! – 2010-07-12 02:59:42

0

而且,看起來像嵌套資源不止一個級別深度幾乎可以肯定是一個壞主意:

http://weblog.jamisbuck.org/2007/2/5/nesting-resources

是啊,這是一個老的文章,但它使一個很大的意義對我來說。

如果有人不同意,我想聽聽爲什麼。

相關問題