Ich möchte eine dynamischere Art der Arbeit mit Filterketten in Ruby on Rails 2.3.2 haben.Ruby on Rails FilterChain Interna - wie man es nachladbar macht?
Im Moment wird die Filterkette aufgebaut, wenn die Klassen geladen werden. Ich habe ein ganz besonderes Bedürfnis, dass die Filterkette zu einem bestimmten Zeitpunkt nach dem Laden der Klassen neu aufgebaut wird.
Dies ist mit einem Rails-Projekt (Spree, Radiant ebenfalls betroffen sein kann ich vermute) zu tun, die Erweiterungen verwendet, die nach der Filterkette wurde für MyController gebaut Dinge wie diese tun können:
MyController.class_eval do
before_filter :my_filter_method
end
ApplicationController.class_eval do
before_filter :app_filter_method
end
Das Problem hier ist, dass der app_filter_method
Filter wird nicht der MyController Filterkette hinzugefügt werden. Dies liegt daran, dass die Filterkette von MyController aus einer früheren Kopie der Filterkette von ApplicationController aufgebaut ist. Diese Kopie der Filterkette von ApplicationController tut nicht, noch haben Sie den app_filter_method
Filter darauf angewendet.
kann ich 2 Plätze denken, so weit, dass der Wiederaufbau der filter in passieren könnte:
1) Jedes Mal, wenn es auf MyController.filter_chain
2) nachladbare auf Anfrage genannt. Also wird MyController.reload_filter_chain die Filterkette neu aufbauen, wobei die Filter aus MyControllers Unterklassen in der Kette verwendet werden.
Vielleicht eine Unterklasse von FilterChain wie ReloadableFilterChain, die die Filterkette für jede Anfrage baut, könnte es tun - Gedanken?
Hier sind die Links zur Quelle der filters.rb auf GitHub, für Ruby on Rails 2.3.2:
The filter_chain method (line 573)
The FilterChain class (line 10)
Ich war hier einige von Ihnen Hoffnung, vielleicht einen kleinen Einblick haben oder Ratschläge, wie dies zu tun ist.
Jede Hilfe sehr geschätzt.
Eliot
Weitere Einzelheiten wie gewünscht:
Spree ist eine Rails-Anwendung, die Erweiterungen verwendet Verhalten zu ändern.
Manchmal wird eine Erweiterung verwendet, um einen Filter zu einem Controller hinzuzufügen (wie im Beispielcode in der Frage). Ein Beispiel ist die statische Inhaltserweiterung.
Die Erweiterung für statische Inhalte ermöglicht das Anzeigen von in der Datenbank gespeicherten HTML-Seiten, die für jeden von Ihnen angegebenen Anforderungspfad angezeigt werden. Sie können beispielsweise eine dieser HTML-Seiten anstelle des Standardinhalts anzeigen, den Spree für den/products-Anfragepfad anzeigt.
Die statische Inhaltserweiterung filtert alle Anfragen und prüft den Pfad. Wenn der Pfad mit einer der Seiten in der Datenbank übereinstimmt, rendert der Filter die Seite.
Die statische Inhalt Erweiterung erklärt seine Filter in etwa so:
Spree::BaseController.class_eval do
before_filter :render_page_if_exists
def render_page_if_exists
...
end
end
Weitere Details auf, was Sie versuchen wäre nützlich zu erreichen. – jonnii
Ein * kleines * Detail hinzugefügt. Gibt es etwas Spezifisches, das ich hinzufügen kann, um zu helfen? –
Ich interessiere mich mehr für das Warum. – jonnii