Wie kann ich die Reihenfolge angeben, in der before_filters ausgeführt werden?


68

Gibt Rails eine Garantie für die Reihenfolge, in der Filter mit einer der folgenden Verwendungen ausgeführt werden:

before_filter [:fn1, :fn2]

oder

before_filter :fn1
before_filter :fn2

Ich würde mich über jede Hilfe freuen.

Antworten:


87

Wenn Sie auf http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html verweisen , gibt es eine Unterüberschrift mit dem Namen "Filterkettenreihenfolge". Hier ist der Beispielcode daraus:

class ShoppingController < ActionController::Base
    before_filter :verify_open_shop

class CheckoutController < ShoppingController
    prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock

Nach der Erklärung:

Die Filterkette für die CheckoutControllerist jetzt :ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop.

Sie können also die Reihenfolge der Filterkette explizit so angeben.


Genau das, wonach ich gesucht habe. @Johnny Du bist ein Leben sicherer. Ich danke dir sehr.
Surya

@Sector und JohnnyWoo: Ihre Links zu rails.rubyonrails.org/classes/ActionController/Filters/… sind tot.
Kevin

1
Auf Schienen 3.2.14 ist die Filterkette, die ich bekomme, die folgende :: sure_items_in_stock ,: sure_items_in_cart ,: verify_open_shop
Raf


1
Ein Befehl zum Ausgeben und Debuggen der genauen Filterkette wäre hilfreich.
Epigene

25

Vor_Filter Bestellung in Schienen http://b2.broom9.com/?p=806

Bestellung der Filterkette http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

Wenn Sie eine Garantiebestellung benötigen, können Sie dies tun:

before_filter :fn3

def fn3
  fn1
  fn2
end

3
Wird das nicht zu Problemen führen, wenn beide fehlschlagen und versuchen, umzuleiten?
Groxx

Sie können verwenden, wenn in fn3 mit Check Return Ergebnis von fn1, fn2
Sektor

Wenn fn1 fehlschlägt (dh false zurückgibt) und fn2 nicht ausführen muss, müssen Sie etwas mehr Logik hinzufügen. So etwas wie:fn1 ? fn2 : false
Eric H.

3

Soweit ich das beurteilen kann, setzen Sie die erste Funktion, die Sie ausführen möchten, und so weiter.

Also so etwas wie:

before_filter :fn1, :fn2

def fn1
  puts 'foo'
end

def fn2
  puts 'bar'
end

Würde ausführen fn1, dann fn2.

Hoffentlich hilft das.


Ich benutze Rails 4 und selbst wenn meine Bestellung lautet :fn1, :fn2: fn2 wird zuerst aufgerufen.
r3b00t

1

Die Filterkette für CheckoutControllerfolgt nicht dieser Reihenfolge

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop

Stattdessen sollte es sein

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.