2009-04-30 7 views
26

In einem Controller in meiner Rails-Anwendung, kann ich dies tun:before_filter und respond_to Formate

before_filter :login_required, :except => :index 

Aber ich möchte den Filter anwenden, nicht nur auf der Grundlage des Aktionsnamen, sondern auf das Format des Antrags. Mit anderen Worten würde ich gerne so etwas tun:

before_filter :login_required, :except => {:action => :index, :format => :js} 

Ist das möglich?

Antwort

25

Sie müssen Ihre eigenen ein bisschen rollen. Versuchen Sie dies als Ausgangspunkt.

before_filter :login_required, :except => [:index] 

before_filter(:only => :index) do |controller| 
    login_required unless controller.request.format.js? 
end 
+1

Vielen Dank für Ihre Hilfe. Ich musste nur die login_required mit controller.send (: login_required) ersetzen before_filter (: nur =>: index) do | controller | controller.send (: login_required) außer controller.request.format.js? Ende – gdelfino

+0

Lassen Sie mich meinen Kommentar wiederholen, da der Code nicht so angezeigt wurde, wie ich es erwartet hatte. Ich musste nur die login_required mit controller.send ersetzen (: login_required) Danke. – gdelfino

+0

arbeitete wie Charme mit Tipp von Gdelfino – whizcreed

10

Eine andere Möglichkeit, die ich denke, ist sauberer als die Antwort akzeptiert, ist die if oder unless Optionen mit einem Lambda zu verwenden. Ich mag es einfach, den Namen der Methode als Symbol aufzuführen, damit er mit den anderen Controller-Filtern standardisiert wird. Dies funktioniert in Rails 3 und höher.

before_filter :login_required, except: :index, 
    unless: -> { |controller| controller.request.format.js? } 
13

Denken Sie daran, Sie können das Lambda auch zu einer Methode extrahieren. Dies kann bei der Lesbarkeit helfen. Es kann auch die Überprüfung mehrerer Filter vereinfachen.

before_filter :login_required, except: :index, unless: :js_request? 

private 

def js_request? 
    request.format.js? 
end 
+1

Arbeit perfekt, aber ich benutze 'request.format.json?' – inye