2012-03-21 26 views
3

我有很多控制器會有一些類似的行爲,例如,用戶應該已經登錄,需要設置一些範圍,需要設置current_account/current_user並且緩存權限。子類化控制器,以及何時調用超級

我想使用一個標準的控制器和子類。

class MyStandardController < ApplicationController 
before_filter :xyz 
end 

class SomeController < MyStandardController 
end 

我想知道的是我需要/什麼時候打電話給super

感謝

+0

我還會注意到你所引用的大多數環繞用戶認證(他們是他們?)和授權(他們是否有權訪問特定的資源?),這些最好的處理方式是像authlogic這樣的寶石或者用cancan設計的。 – 2012-03-21 15:19:38

+0

我正在使用設計,我可能會使用康康。 – 2012-03-21 16:32:43

回答

5

你不需要調用過super從另一個控制器繼承控制器內;事實上,這樣做可能會有點奇怪。 Super從超類中執行同名的方法,並且您可能不會在MyStandardController上有任何方法,您將在其子中重新定義它。

這樣做的主要原因是,正如你所說的那樣,在控制器之間輕鬆地獲得過濾器和方法的名稱空間。我們在我們的應用程序中做了類似的事情,其中​​具有非常類似行爲的站點的一個區域將從控制器(如ShoppingController)繼承,該控制器具有僅適用於所有子項的私人便利方法的一部分。

但是,現實地說,最好是讓模塊實現所需的功能,並將它們包含在所需的控制器中。最終你可能會想要從另一個控制器獲得一些東西,而使用模塊比使用複雜的繼承層次更容易。

+0

完全同意Veraticus。一個簡單的解決方法是將'before_filter'放入'application_controller.rb'中 - 這對於身份驗證等情況來說是很典型的。如果真的有一個命名空間(應用程序的行爲的一個子集,例如「Admin」),那麼創建一個包含像Admin :: UserManager這樣的模型(以及視圖和控制器)的模塊並不是一個可怕的想法 - 那麼before_filter可以在'admin_controller.rb'中定義(我想) – 2012-03-21 15:29:08

+1

感謝另一個問題,如果我定義了一個方法,例如。 MyStandardController中的mydef,我如何使它在我的視圖中可用?如果我使用helper_method在MyStandardController中指定助手,它似乎並不適用於子控件所使用的控件。 – 2012-03-21 16:30:12

+0

你可能不應該這樣做。改爲使用幫助器方法,或者在控制器操作中調用方法,並通過實例變量將結果提供給視圖。 – Veraticus 2012-03-21 16:33:01

相關問題