web-dev-qa-db-fra.com

Comment puis-je spécifier l'ordre d'exécution des before_filters?

Rails donne-t-il des garanties quant à l'ordre avant l'exécution des filtres avec l'une des utilisations suivantes:

before_filter [:fn1, :fn2]

ou

before_filter :fn1
before_filter :fn2

J'apprécierais toute aide.

65
James

Si vous faites référence http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html , il existe une sous-rubrique appelée "Filter chain ordering", voici l'exemple de code à partir de ce:

class ShoppingController < ActionController::Base
    before_filter :verify_open_shop

class CheckoutController < ShoppingController
    prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock

Selon l'explication:

La chaîne de filtres pour le CheckoutController est maintenant :ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop.

Vous pouvez donc explicitement donner l'ordre de la chaîne de filtrage comme ça.

81
Johnny Woo

Commande Before_filter en Rails http://b2.broom9.com/?p=806

Ordre des chaînes de filtres http://Rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

Si vous avez besoin d'un ordre de garantie, vous pouvez le faire:

before_filter :fn3

def fn3
  fn1
  fn2
end
24
Sector

pour autant que je sache, vous mettez la première fonction que vous voulez exécuter et ainsi de suite.

Donc, quelque chose comme:

before_filter :fn1, :fn2

def fn1
  puts 'foo'
end

def fn2
  puts 'bar'
end

Exécuterait fn1, puis fn2.

J'espère que cela pourra aider.

2
Christian Fazzini

La chaîne de filtres pour le CheckoutController ne suit pas cet ordre

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop

Au lieu de cela, il devrait être

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop
1
HEraju