13

我在Rails的2.3.5,我有這樣的問題:爲什麼Rails before_filter在控制器被子類化時調用兩次?

class BaseController < ApplicationController 
    before_filter :foo, :only => [:index] 
end 

class ChildController < BaseController 
    before_filter :foo, :only => [:index, :show, :other, :actions] 
end 

的問題是,在ChildController的:過濾器之前FOO被調用兩次。

我已經嘗試了一些解決此問題的解決方法。如果我不在孩子中包含:index操作,它將永遠不會被請求執行該操作。

的解決方案,我發現的作品,但我認爲這是非常非常難看

skip_before_filter :foo 
before_filter :foo, :only => [:index, :show, :other, :actions] 

有沒有更好的辦法來解決這個問題呢?

回答

15

「這種行爲是通過設計的」。

控制器上的Rails的指南指出:

「過濾器是繼承的,因此,如果您設置的ApplicationController一個過濾器,它會在你的應用程序中每個控制器上運行」

這解釋了您所看到的行爲。它還提出了與您建議的完全相同的解決方案(使用skip_before_filter)來定義哪些過濾器將針對特定控制器和/或方法運行或不運行。

因此,看起來像你找到的解決方案是常見的和批准的做法。

http://guides.rubyonrails.org/action_controller_overview.html#filters

3

如果你不想使用skip_before_filter你總是可以跳過在ChildControllerindex行動:

class ChildController < BaseController 
    before_filter :foo, :only => [:show, :other, :actions] 
end 

但是,如果你在BaseController改變行爲,這可能會成爲一個問題,從index操作中刪除過濾器。那麼它永遠不會被稱爲使用skip_before_filter可能是一個更好的主意。

相關問題