2009-07-18 122 views
1

在註冊過濾器的抽象超類中,它們在控制器類中註冊的過濾器之前。假設我想在過濾器鏈的最後執行一個名爲authenticate的方法作爲過濾器。唯一可以解決的方法是將before_filter聲明爲所有控制器類中的最後一個過濾器(並且其中有很多)。有沒有辦法在超類中聲明這個過濾器,並讓它最後仍然被執行?我最後要執行它的原因是控制器類可能只是針對該控制器修改身份驗證要求,並且我希望在調用最終身份驗證過濾器之前將這些修改考慮在內。如何在超類的過濾器鏈的最後添加一個過濾器?

回答

2

使用prepend_before_filter在你的控制器類,而不是before_filterappend_before_filter

0

Rails的調用你的ApplicationController第一,當地的一個前...所以你可以做這樣的事情(使用爲例):

在應用程序控制器,你有你before_filter回調,以及相應的方法被調用:

before_filter :authenticate 


def authenticate 
    # do something 
end 

在控制器你正在使用的資源類型...

你可以重新定義/覆蓋authenticate

def authenticate 
# do something else 
end 

你甚至可以選擇不使用你的authenticate回調一些方法

skip_before_filter :authenticate, :only => :my_method_without_auth 
+0

感謝您的支持,但驗證方法會檢查某些配額以查看當前操作是否「允許」。這些限制在應用程序控制器中調用的過濾器之前在另一箇中設置。但是,假設我有一個控制器,我想要進一步更改配額,只能從控制器類觸發,並且爲了通過身份驗證考慮這些配額,需要在設置新配額後運行身份驗證,因此認證需要在控制器類中聲明,然後再過濾該模塊的配額。 – 2009-07-18 09:52:56

+1

爲什麼不用一個before_filter回調...並使用該方法來設置所需的所有內容? – mylescarrick 2009-07-19 04:11:53