2013-02-07 7 views

risposta

22

Per garantire che i filtri vengano applicati a tutte le azioni, posizionarlo in application_controller.rb.

+1

E se yo vuole aggiungere un filtro ad eccezione di quello? come eseguiresti il ​​filtro per tutte le azioni su tutti i controller tranne che per l'azione indice del controller degli utenti? @ David Hahn – Cas

+3

Si dovrebbe aggiungere: 'skip_before_filter: verify_logged_in,: except => [: index]' al controller degli utenti. –

0

Inseritelo nello ApplicationController e ereditate tutti gli altri controller da esso. Se non si sovrascrive lo verify_logged_in in uno dei sottocontrolli, semplicemente funziona.

10

Application Controller è la classe base di tutte le altre classi.

Se si mette alcun filtro in questa classe, allora il flusso funziona come segue:

Se colpite URL dire di users risorse con qualsiasi azione dire index azione poi:

Il controllo viene effettuato prima con Application Controller. Lì controlla i filtri, se ne trova uno quindi esegue il metodo di filtro e dopo va all'azione index del controller degli utenti.

Application Controller:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :verify_logged_in 

end 

altro controller:

class UsersController < ApplicationController 

    def index 

    end 

Qui nel codice qui sopra si vede che l'altro controller eredita il contenuto del controller di madre che è application controller . Pertanto, se si inserisce before_filter nel controller dell'applicazione, per ogni utente verrà verificato se l'utente ha effettuato l'accesso per ogni richiesta.

+0

E cosa faccio quando utilizzo una libreria come omniauth che non utilizza il controller dell'applicazione per le sue azioni? – panzi

4

put before_filter nella classe di base (nel file di application_controller.rb), che funzionerà sulla base e tutte le sue classi derivate, come ad esempio

class ApplicationController < ActionController::Base 
    before_filter :set_locale 

    def set_locale 
    I18n.locale = params[:locale] or I18n.default_locale 
    end 
end 

buona fortuna :-)

Problemi correlati