2009-04-30 20 views
26

In un controller nel mio Rails app, posso fare questo:before_filter e respond_to formati

before_filter :login_required, :except => :index 

Ma vorrei applicare il filtro non solo in base al nome dell'azione, ma sul formato della richiesta. In altre parole, vorrei fare qualcosa del genere:

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

È possibile?

risposta

25

Avrai bisogno di rotolare il tuo un po '. Prova questo come punto di partenza.

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

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

Grazie per il vostro aiuto. Ho dovuto solo sostituire login_required con controller.send (: login_required) before_filter (: only =>: index) do | controller | controller.send (: login_required) a meno che controller.request.format.js? fine – gdelfino

+0

Lasciatemi ripetere il mio commento poiché il codice non si presentava come mi aspettavo. Ho dovuto solo sostituire il login_required con controller.send (: login_required) Grazie. – gdelfino

+0

ha funzionato come un incantesimo con la punta di gdelfino – whizcreed

10

Un altro modo, che credo sia più pulita la risposta accettata, è quello di utilizzare le if o unless opzioni con un lambda. Mi piace solo che il nome del metodo sia elencato come simbolo, quindi è standardizzato con gli altri filtri del controller. Funziona su Rails 3 e versioni successive.

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

Ricordare, è possibile estrarre il lambda anche in un metodo. Questo può aiutare con la leggibilità. Può anche rendere più semplice l'uso dello stesso controllo su più filtri.

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

private 

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

Funziona perfettamente, ma io uso 'request.format.json?' – inye

Problemi correlati