2011-06-15 25 views
45

我在過濾器工作在最近從1.9(?)升級到2.3.11的Rails應用程序中遇到問題。要嘗試並調試它,我已經把的before_filter,控制器:before_filter未取消動作

before_filter :false_filter 

和application_controller.rb如下:

def false_filter 
    puts "false filter running" 
    false 
end 

我那麼無論從黃瓜/ webrat或瀏覽器中調用該方法,並且當過濾器被調用(我可以看到輸出消息的投入)時,過濾器鏈不會終止。

我想知道是否有一些樣板代碼尚未生成。任何人都可以建議去哪裏看?

+9

您可能與積極的記錄before_xxx方法,當返回false時不保存記錄相混淆 – 2011-06-15 07:13:03

回答

89

沒有任何關注之前過濾器的返回值。如果你想停止處理,你必須使您的過濾器的東西或重定向到其他地方,from the fine guide

如果過濾器渲染或重定向之前,該操作將無法運行。如果在該過濾器之後計劃運行其他過濾器,則它們也將被取消。

相同的文字出現在2.3.8 guide

這種行爲確實有意義,如果過濾器鏈沒有完成(即停止過濾部分路徑),那麼你最終會調用控制器方法的事情沒有設置他們期待他們的方式,只會導致痛苦,痛苦和困惑,而這一點都不友好或樂趣。

+5

我正在看的例子做一個重定向,然後返回false,並鎖定到虛假的部分,結果是正是如此。這一切都很合理 - 謝謝。 – 2011-06-15 20:28:22

+8

@Henry:不要感覺不好,我發現很多Rails和Ruby文檔對於這樣的細節有點稀疏。 – 2011-06-15 20:46:30

+0

@ muistooshort需要一些幫助。我正在瀏覽[設計模式](http://en.wikipedia.org/wiki/Design_Patterns),其中大部分使用不是Ruby主題的「接口」。所以,我無法理解他們。任何提示如何學習這些?我無法在Ruby中編寫它們。逐行翻譯我不認爲會是更好的選擇。請建議我。 – 2015-02-12 06:35:03