2011-04-19 71 views

回答

78

如果你是指http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html,還有一個副標題稱爲「濾波器鏈順序」,這裏是示例代碼:

class ShoppingController < ActionController::Base 
    before_filter :verify_open_shop 

class CheckoutController < ShoppingController 
    prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock 

據解釋:

的過濾器鏈的CheckoutController現在 :ensure_items_in_cart:ensure_items_in_stock:verify_open_shop.

所以,你可以明確地給過濾器鏈那樣的順序。

+0

正是我在找什麼...... @Johnny你是一個安全的生活。非常感謝。 – Surya 2013-05-14 17:22:58

+0

@Sector和JohnnyWoo:你到http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html的鏈接已經死了。 – Kevin 2013-07-25 16:15:44

+1

在rails 3.2.14上,我得到的過濾器鏈如下::ensure_items_in_stock,:ensure_items_in_cart,:verify_open_shop – Raf 2013-10-04 09:44:58

2

據我所知,你把你想要執行的第一個功能,等等。

所以,像這樣:

before_filter :fn1, :fn2 

def fn1 
    puts 'foo' 
end 

def fn2 
    puts 'bar' 
end 

將執行fn1,然後fn2

希望有所幫助。

+0

我使用Rails 4,即使我的訂單是':FN1,:FN2 ',:fn2首先被調用。 – Reboot 2017-08-21 07:55:46

23

的before_filter秩序的Rails http://b2.broom9.com/?p=806

過濾器鏈訂貨 http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

如果你需要保證順序,你可以這樣做:

before_filter :fn3 

def fn3 
    fn1 
    fn2 
end 
+3

如果兩者均失敗並不會導致問題,並嘗試重定向? – Groxx 2011-08-24 01:26:48

+0

如果在fn3中使用if檢查返回結果fn1,fn2 – Sector 2011-08-24 07:33:22

+0

如果fn1失敗(即返回false)並且不需要執行fn2,則必須添加更多的邏輯。類似於:'fn1? fn2:false' – 2014-06-19 18:48:24

1

的過濾器鏈的CheckoutController不遵循這個順序

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop 

相反,它應該是

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop