爲了在我們的應用程序中進行組織,我根據情況完成了一切。
首先,關於管理員/用戶功能的單獨控制器,我會說你可能不想走那條路線。我們使用授權和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
其他優點是易於設置的菜單系統和標籤。這些結構適合於有組織的網站。
我希望這有助於!
太棒了。這正是我需要的。我特別喜歡使用名稱空間並從基本控制器繼承的想法。 此外,我沒有考慮使用CanCan,但我一定會檢查出來。 謝謝! – 2010-07-12 02:59:42