2011-04-19 50 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