Wie füge ich einen before_filter in einem gem nach allen anderen controller before_filters in einer Rails3 App an?

9

Es gibt ein Juwel, das eine before_filter an eine Rails App anfügt:

%Vor%

Und hier ist ein Controller in der App:

%Vor%

Nun besteht das Problem darin, dass das before_filter vom Edelstein in die Filterkette vor dem before_filter vom DesktopsController gestellt wird:

%Vor%

Wie kann ich before_filter aus dem Juwel ( set_locale ) nach anderen Filtern platzieren? Das Geheimnis liegt wahrscheinlich in dieser Zeile:

%Vor%

Aber ich habe verschiedene Bibliotheken ohne Glück ausprobiert ...

Übrigens. Hier ist der vollständige Code des Edelsteins. Ruby 1.9.2, Rails 3.0.5.

    
Paweł Gościcki 16.09.2011, 15:54
quelle

7 Antworten

3

Die Anpassung des Edelsteins wird niemals funktionieren. Der Edelstein wird als eines der ersten Dinge im Schienenprozess initialisiert, also bevor irgendein tatsächlicher Controller jemals gestartet wird. Das bedeutet also, dass, egal was du tust, der Filter des Edelsteins immer noch der erste Edelstein bleibt.

Die einzigen Lösungen, die ich sehe, sind:

  • Verwenden Sie prepend_before_filter in Ihren eigenen Controllern für die Aktionen, die vor dem set_locale .
  • stehen müssen
  • Wenn Sie eine explizite Kontrolle benötigen, verwenden Sie skip_before_filter und explicit before_filter .

In einer Anwendung von rails 2 haben wir einen Hack entwickelt, um sicherzustellen, dass ein Filter als letzter Filter ausgeführt wurde, indem Sie perform_action_without_filters überschreiben (siehe Gibt es eine Möglichkeit, ein before_filter zu zwingen, immer zuletzt auszuführen? ), aber wir haben das wann entfernt Upgrade auf Schienen 3.

    
nathanvda 25.09.2011, 21:28
quelle
2

Meine Antwort basiert auf nickgrims antwort , was ich auch ziemlich clever fand. Der Block, der an included übergeben wurde, erhält die Klasse evaled ( class_eval ), wenn das Modul enthalten ist. Sie können set_locale_filter zu einer Klassenmethode machen, indem Sie sie (unter anderem) im Block included definieren.

%Vor%

Jemand, bitte korrigieren Sie mich, wenn ich mich irre. Es ist spät hier:)

    
dwhalen 21.09.2011 06:39
quelle
0

Versuchen Sie Folgendes:

%Vor%

Referenz

skip_before_filter doc

    
Harish Shetty 16.09.2011 16:51
quelle
0

Ich habe es nicht ausprobiert, aber Sie könnten prepend_before_filter auschecken, das den angegebenen Filter an den Anfang der Liste (und schließlich vor: set_locale) stößt.

%Vor%

Text & Tabellen: Ссылка

Eine andere Sache, die Sie ausprobieren sollten, ist die Verwendung eines around_filters für: set_language_in_session (obwohl Sie nach der Aktion nichts tun). Um Filter treten vor before_filters auf, also könnte es ein guter Weg sein, es zuerst zu erzwingen.

    
CambridgeMike 20.09.2011 14:43
quelle
0

Der Edelstein selbst ist auf Github, also kannst du ihn abzweigen und den Code ändern, dann ziehe deinen Code stattdessen deine Version des Edelsteins. Ist das eine Option? Wenn ja, könntest du einfach die before_filer im Juwel auskommentieren und sie selbst in deinem ApplicationController nennen:

%Vor%

Jetzt rufen Sie es einfach nach all Ihren anderen Filtern auf:

%Vor%

Was denkst du?

    
Rob Cameron 20.09.2011 17:53
quelle
-1

Habe das überhaupt nicht probiert, aber: Könnten Sie die before_filter run des Gems append_before_filter haben? Etwas wie:

%Vor%     
nickgrim 19.09.2011 10:25
quelle
-1

Ich persönlich würde wahrscheinlich eine Middleware schreiben, die Ihre Operation erledigt, weil Sie sich dann keine Gedanken über die Reihenfolge der Filter machen müssen.

Ссылка

    
Scott Schulthess 23.09.2011 21:23
quelle