2009-07-18 6 views
1

in Schienen Wenn Sie Filter in abstrakten Oberklassen registrieren, kommen sie vor den in der Controller-Klasse registrierten Filtern. Angenommen, ich möchte eine Methode namens authenticate als Filter direkt am Ende der Filterkette ausführen. Der einzige Weg, wie ich es herausfinden kann, ist, dass before_filter als der letzte Filter in all meinen Controller-Klassen deklariert wird (und es gibt viele von ihnen). Gibt es eine Möglichkeit, diesen Filter in der Oberklasse zu deklarieren und ihn zuletzt noch ausführen zu lassen? Der Grund, warum ich es zuletzt ausführen möchte, ist, dass die Controller-Klasse die Authentifizierungsanforderungen nur für diesen Controller ändern könnte, und ich möchte, dass diese Änderungen berücksichtigt werden, bevor der endgültige Authentifizierungsfilter aufgerufen wird.Wie hängt man einen Filter an das Ende einer Filterkette von einer Oberklasse an?

Antwort

2

Verwenden prepend_before_filter verwenden anstelle von before_filter oder append_before_filter.

+0

Danke auch für diesen Vorschlag, aber ich habe eine Methode in der abstrakten Oberklasse, die zuerst ausgeführt werden muss, und so Prepend_before_filter auf der Controller-Klasse aufrufen wird diesen Filter vor demjenigen, der zuerst ausgeführt werden muss (es ändert die Datenbank basiert auf die eingehende URL). –

+0

Wahrscheinlich die nächste Antwort, beantwortet aber die ursprüngliche Frage nicht wirklich. Ich denke nicht, dass es einen Weg gibt, es auf Schienen zu machen. –

0

Rails ruft Ihre Application zunächst vor dem lokalen ein ... so kann man so etwas tun (Ihr Beispiel verwenden):

in Ihrer Anwendung Controller werden Sie Ihren before_filter Rückruf haben, und ein entsprechendes Verfahren dass wird aufgerufen:

before_filter :authenticate 


def authenticate 
    # do something 
end 

In der Steuerung für den Ressourcentyp Sie arbeiten mit ...

Sie können neu definieren/außer Kraft setzen authenticate

def authenticate 
# do something else 
end 

Sie können sogar wählen, NICHT Ihren authenticate Rückruf für einige Methoden in der Controller-Klassen

skip_before_filter :authenticate, :only => :my_method_without_auth 
+0

Danke dafür, aber die Authentifizierungsmethode prüft bestimmte Berechtigungen, um zu sehen, ob die aktuelle Aktion 'erlaubt' ist. Diese Berechtigungen werden in einem anderen vor dem Filter eingerichtet, der im Anwendungscontroller aufgerufen wird. Wenn ich jedoch einen Controller habe, bei dem ich die Berechtigungen weiter ändern möchte, kann dies nur von der Controller-Klasse ausgelöst werden, und damit diese Berechtigungen authentifiziert werden können, muss die Authentifizierung nach der Festlegung der neuen Zertifikate erfolgen authenticate muss in der Controller-Klasse nach dem anderen deklariert werden, bevor die Mods die Berechtigungen filtern. –

+1

Warum haben Sie nicht einen einzigen before_filter Callback ... und verwenden Sie diese Methode, um alles einzurichten, was Sie brauchen? – mylescarrick

+0

Diese Idee ist nicht wirklich praktikabel. Ich denke, Filter sind da, damit Sie Aufgaben auf verständliche Weise aufteilen können. Außerdem wird diese Authentifizierungsmethode auf jedem Controller ausgeführt. Diese Controller machen alle verschiedene Dinge. –