Es gibt ein Juwel, das eine before_filter
an eine Rails App anfügt:
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:
Wie kann ich before_filter
aus dem Juwel ( set_locale ) nach anderen Filtern platzieren? Das Geheimnis liegt wahrscheinlich in dieser Zeile:
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.
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:
prepend_before_filter
in Ihren eigenen Controllern für die Aktionen, die vor dem set_locale
. 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.
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.
Jemand, bitte korrigieren Sie mich, wenn ich mich irre. Es ist spät hier:)
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.
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:
Jetzt rufen Sie es einfach nach all Ihren anderen Filtern auf:
%Vor%Was denkst du?
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.
Tags und Links ruby ruby-on-rails-3 ruby-on-rails gem