2012-11-25 69 views
2

我的模型認爲費用,包括用戶和項目引用..Rails - 用戶和管理員的CRUD,多少個控制器?

class Expense < ActiveRecord::Base 
    attr_accessible :amount, :expense_date, :description, :project_id, :user_id 

     belongs_to :project 
     belongs_to :user 
end 

的ExpensesController處理的費用基本的CRUD操作。

我現在需要建立同一個頁面的管理員版本,最好是一個新的視圖,它可以包括數據的不同視圖,用戶,項目等,還可以編輯用戶不能。

我的問題是:建立第二個控制器來處理數據的管理角度,或者我在每個方法內部設置條件,檢測原始視圖和表單,然後重定向它們的條件到他們所屬的地方?

如果我建立第二個控制器,我該如何正確設置form_for以便它知道要使用哪個控制器?

謝謝!

PS - 如果任何人有任何關於如何正確放置Rails應用程序的書籍,我覺得我知道這些部分的螞蟻部件,但我陷入了大圖的執行。我在Michael Hartl的指導下學習了rails,在此之前我是一名PHP開發人員。

回答

3

恕我直言,如果安全性是您的應用程序的一大擔憂,那麼使用管理員名稱空間和單獨的控制器是確保您不會留下任何空白的最佳方法。這也只是更簡單和更低的壓力。

我會像這樣的目錄結構:

/app/controllers/application_controller.rb 
/app/controllers/admin_controller.rb - inherits from application_controller 
/app/controllers/expenses_controller.rb - non-admin, inherits from application_controller 
/app/controllers/admin/expenses_controller.rb - inherits from admin_controller 

您的意見將進行類似分離/複製:

/app/views/expenses/* - non-admin expenses views 
/app/views/admin/expenses/* - admin expenses views 

在application_controller你把設計方法與authenticate_user和慘慘方法check_authorization(如果授權未在控制器操作中的某個位置進行檢查,則會引發異常)。在admin_controller中,您有更嚴格的過濾器來確保用戶是管理員。然後你可以在特定的控制器和他們的行爲中獲得更多的細節。

當然,每個控制器只需要定義它真正需要的動作,而且您不必複製視圖。也許非管理費用控制器具有索引,顯示,新建,創建,而管理員只能編輯,更新和銷燬。然後在'show'視圖中​​,如果用戶是管理員,您仍然有代碼添加到「編輯」操作的鏈接。

編輯 - 路線

通過上面的例子,你的routes.rb看起來是這樣的:

resources :expenses, :only => [:index, :show, :new, :create] 

namespace :admin do 
    resources :expenses, :only => [:edit, :update, :destroy] 
end 

所以你還是使用expenses_path()的索引和expense_path(foo)作秀。但是,管理頁面上的表單將張貼到admin_expense_path(@expense)

+0

非常感謝你,這使得很多的意義。在我的表單中,是否指定一個名稱空間呢? – Atari2600

+0

是的,用於管理員操作。我剛剛編輯了一些關於路線的更多細節。 – vpsz

+0

非常感謝你! – Atari2600

2

如果你想添加另一個控制器,我會建議在模塊中使用通用代碼並將它們導入到每個控制器中。每個控制器在過濾器之前也有足夠的權利。

但我寧願有一個控制器和一組視圖,因爲我認爲它避免了代碼重複和/或混淆。將用戶作爲局部變量傳遞給視圖,並在需要確定form_for的URL或是隱藏還是顯示某個部分時檢查管理員權限。

如果視圖顯着不同,請檢查控制器中的管理員權限並呈現用戶視圖或管理視圖。

你甚至可以爲視圖的管理部分創建一個特殊的部分,並決定是否在視圖中渲染它,在params中發送適當的數據或不是。

+0

謝謝,模塊是什麼意思? – Atari2600

+0

[Module](http://www.ruby-doc.org/core-1.9.3/Module.html)是Class的超類。基本上,它就像一個類,除了不能被實例化並且可以被包含在其他類中以提供方法,常量等。只是一種組織代碼並避免重複的方式。 – buftlica

1

您可以使用Devise gem進行身份驗證。 您可以爲應用程序的管理部分創建一些「名稱空間」。

我認爲,創建另一個控制器取決於您的管理員將訪問多少個視圖和操作。

關於form_for action的疑問,它將由您在form_for params中配置的路由和路徑進行管理。

+0

謝謝,是的,我使用設計,我只需要一些關於如何管理一個模型的兩個視圖/控制器的全面指導。 – Atari2600

相關問題