Как я могу указать порядок выполнения before_filters? - PullRequest
65 голосов
/ 19 апреля 2011

Обеспечивает ли рельсы какие-либо гарантии относительно порядка выполнения фильтров до одного из следующих способов:

before_filter [:fn1, :fn2]

или

before_filter :fn1
before_filter :fn2

Буду признателен за любую помощь.

Ответы [ 4 ]

80 голосов
/ 17 марта 2012

Если вы ссылаетесь 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.

Таким образом, вы можете явно указать порядок цепочки фильтров следующим образом.

24 голосов
/ 19 апреля 2011

Before_filter Order in Rails http://b2.broom9.com/?p=806

Заказ цепи фильтра http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

Если вам нужен гарантийный заказ, вы можете сделать это:

before_filter :fn3

def fn3
  fn1
  fn2
end
2 голосов
/ 19 апреля 2011

Насколько я могу судить, вы ставите первую функцию, которую хотите выполнить, и т. Д.

Итак, что-то вроде:

before_filter :fn1, :fn2

def fn1
  puts 'foo'
end

def fn2
  puts 'bar'
end

Выполнит fn1, затем fn2.

Надеюсь, это поможет.

1 голос
/ 18 апреля 2016

Цепочка фильтров для CheckoutController не следует этому порядку

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop

Вместо этого должно быть

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop
...