【发布时间】:2011-08-08 09:09:33
【问题描述】:
rails 是否对使用以下任一用法的过滤器执行之前的顺序做出任何保证:
before_filter [:fn1, :fn2]
或
before_filter :fn1
before_filter :fn2
如果有任何帮助,我将不胜感激。
【问题讨论】:
标签: ruby-on-rails before-filter
rails 是否对使用以下任一用法的过滤器执行之前的顺序做出任何保证:
before_filter [:fn1, :fn2]
或
before_filter :fn1
before_filter :fn2
如果有任何帮助,我将不胜感激。
【问题讨论】:
标签: ruby-on-rails before-filter
如果您参考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.
所以你可以像这样明确地给出过滤器链的顺序。
【讨论】:
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
【讨论】:
fn1 ? fn2 : false
据我所知,您放置了要执行的第一个函数,依此类推。
所以,类似:
before_filter :fn1, :fn2
def fn1
puts 'foo'
end
def fn2
puts 'bar'
end
将执行fn1,然后执行fn2。
希望对您有所帮助。
【讨论】:
:fn1, :fn2,也会首先调用 :fn2。
CheckoutController 的过滤器链不遵循此顺序
:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop
应该是
:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop
【讨论】: