如何指定执行before_filters的顺序?

时间:2011-04-19 04:59:08

标签: ruby-on-rails before-filter

rails是否对使用以下任一用法执行过滤器之前的顺序做出任何保证:

before_filter [:fn1, :fn2]

before_filter :fn1
before_filter :fn2

我很感激任何帮助。

4 个答案:

答案 0 :(得分:80)

如果您引用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.

因此,您可以明确地给出过滤器链的顺序。

答案 1 :(得分:24)

在Rails中的Before_filter顺序 http://b2.broom9.com/?p=806

过滤链排序 http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

如果您需要担保订单,可以这样做:

before_filter :fn3

def fn3
  fn1
  fn2
end

答案 2 :(得分:2)

据我所知,你把你想要执行的第一个函数等等。

所以,比如:

before_filter :fn1, :fn2

def fn1
  puts 'foo'
end

def fn2
  puts 'bar'
end

执行fn1,然后执行fn2

希望有所帮助。

答案 3 :(得分:1)

CheckoutController的过滤器链不遵循此顺序

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop

相反,它应该是

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop