2010-03-05 9 views
57

Namen und Objekte wurden der Übersichtlichkeit halber vereinfacht. Das Grundkonzept bleibt gleich.Überspringen before_filter in Rails

Ich habe drei Controller: dog, cat und horse. Diese Controller erben alle vom Controller animal. In der Steuerung animal, ich habe einen Filter vor, die einen Benutzer als solche authentifiziert:

before_filter :authenticate 

def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
    name == "foo" && password == "bar" 
    end 
end 

Im show Wirkung von dog, ich brauche für alle Benutzer freien Zugang zu haben (die Authentifizierung überspringen).

Wenn ich die Authentifizierung separat für dog schreiben waren, habe ich so etwas tun könnte:

before_filter :authenticate, :except => :show 

Aber da dog erbt von animal, ich habe keinen Zugriff auf den Controller-spezifischen Aktionen. Das Hinzufügen von :except => :show in der animal-Steuerung wird nicht nur die Authentifizierung für die show Aktion von dog, sondern auch die von cat und horse überspringen. Dieses Verhalten ist nicht erwünscht.

Wie kann ich die Authentifizierung nur für die show Aktion von dog überspringen, während immer noch von animal erben?

Antwort

107
class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 

Siehe ActionController::Filters::ClassMethods für weitere Informationen über Filter enthalten müssen und Erbe.

+2

'skip_before_filter' scheint veraltet zu sein >> [http://apidock.com/rails/ActionController/Filters/ClassMethods/skip_before_filter#1083-deprecated-moved](http://apidock.com/rails/ActionController/ Filter/ClassMethods/skip_before_filter # 1083-deprecated-moved) Es wird empfohlen, 'skip_filter' zu verwenden, das' skip_before_filter ', 'skip_after_filter' und' skip_around_filter' alle zusammen aufruft. – Bachet

+4

nein ist nicht .. sie verschieben nur die Methode in eine andere Klasse, http://apidock.com/rails/v3.2.3/AbstractController/Callbacks/ClassMethods/skip_before_filter – Orlando

+0

ja es wurde verschoben –

3

Hierfür können Sie verwenden skip_before_filter

Es ist in der In Ihrem Beispiel Rails API

erklärt hat dog würde nur

skip_before_filter :authenticate 
12

Die zwei gegebenen Antworten sind halb richtig. Um alle offenen Ihren Hund Aktionen zu verhindern, dass, müssen Sie die skip_before_filter qualifizieren auf die ‚Show‘ Aktion gelten nur, wie folgt:

class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 
2

Nur ein kleines Update, das Schienen 4, es ist jetzt skip_before_action :authenticate, :only => :show mit und Das before_filters sollte jetzt stattdessen before_action verwenden.

+0

Dies sollte ein Kommentar sein. – dan

Verwandte Themen