Как я могу указать порядок выполнения before_filters?
Предоставляет ли рельсы какие-либо гарантии относительно порядка, который до того, как фильтры будут выполнены с любым из следующих способов использования:
before_filter [:fn1, :fn2]
или
before_filter :fn1
before_filter :fn2
Буду признателен за любую помощь.
Ответы
Ответ 1
Если вы ссылаетесь на 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.
Таким образом, вы можете явно указать порядок такой цепочки фильтров.
Ответ 2
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
Насколько я могу судить, вы помещаете первую функцию, которую хотите выполнить, и т.д.
Итак, что-то вроде:
before_filter :fn1, :fn2
def fn1
puts 'foo'
end
def fn2
puts 'bar'
end
Выполняет fn1
, затем fn2
.
Надеюсь, что это поможет.
Ответ 4
Цепочка фильтра для CheckoutController
не соответствует этому порядку
:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop
Вместо этого он должен быть
:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop