2016-03-30 16 views
16

Ho un binario 4.2.x app, con elaborato per l'autenticazione - Ho diversi controller.Come faccio a far eseguire a before_action su tutti i controller e le azioni tranne uno?

Voglio il dispositivo autenticate_utente! metodo da eseguire su tutti i controller e le azioni tranne sull'azione dell'indice del controller domestico. (! Naturalmente, authenticate_user si prende cura che meditano azioni come login passare attraverso)

posso garantire che ogni azione di controllo gestisce il before_action in application_controller.rb:

class ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
    ... 
end 

Posso anche limitare una serie specifica di azioni su tutti i controller:

class ApplicationController < ActionController::Base 
    before_action :authenticate_user!, except: [:index] 
    ... 
end 

Ma non vedo come fare solo home/indice per essere un'eccezione.

È possibile, naturalmente, aggiungere manualmente before_action :authenticate_user! a ogni controller e aggiungere un'eccezione al controller domestico per l'azione dell'indice. Ma questo non è molto secco, e se aggiungo nuovi controller, devo ricordarmi di aggiungere questo before_action a ciascuno di essi.

risposta

38

Quello che devi fare è impostare autheticate_user! su tutti i controller del genere:

class ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
    ... 
end 

E poi sul HomeController fai così:

class HomeController < ApplicationController 
    skip_before_action :authenticate_user!, only: [:index] 
    ... 
end 

Spero che questo vi aiuterà!

+0

Sicuro di aver dichiarato before_action in ApplicationController? –

+0

non importa. Il problema è che non ho saltato prima che l'azione nel controller di autenticazione fosse autonoma, quindi funzionerebbe sempre indipendentemente da cosa. –

Problemi correlati