2016-04-27 9 views
6

Ciao Sto costruendo una sezione API per un'applicazione. I miei controller all api correlati risiedono nella directory app/controllers/api.skip_before_action per alcuni controller in Rails?

La mia preoccupazione è che in application_controller c'è un filtro before_action :authenticate_user!, quindi devo essere in modalità login per accedere all'api.

mia soluzione attuale: Sto aggiungendo skip_before_action :authenticate_user! in tutti i controllori che sono in app/controllers/api directory ..

Problema: devo scrivere in tutti i controllori e ho circa 80 controllori

la mia aspettativa: c'è un modo in cui posso scrivere in application_controller sé qualcosa di simile b efore_action: authenticate_user !, tranne: [all the controllers which are in api directory]

+0

http://stackoverflow.com/a/11785449/2231236 attrezzo simile – Nithin

risposta

2

Si può provare come questo se tutti i controllori sono sotto cartella API:

class ApplicationController < ActionController::Base 
    before_filter :authenticate! 


    def authenticate! 
    if params[:controller].split("/").first == "api" 
     return true # or put code for what wherever authenticate you use for api 
    else 
     authenticate_user! 
    end 
    end 
end 
+0

Sei sicuro che 'params [ : controller] 'contiene il percorso e non solo il nome del controller? –

+1

@ArslanAli, Sì, otterremo il percorso di pull se i controller sono definiti come classe Api :: PasswordsController Thorin

7

Si dovrà specificare skip_before_action :authenticate_user! in ogni controller di cui azioni non dovrebbero essere autenticato. Non è possibile passare il nome del controller o qualcosa del genere come argomento al metodo skip_before_action.

Una soluzione è: Si può fare un controller chiamato APIController, ed è possibile specificare la cosa skip_before_action lì come:

class APIController < ApplicationController 
    skip_before_action :authenticate_user! 
    # rest of the code 
end 

e poi tutti i controllori app/controllers/api/ possono ereditare da APIController.

class OtherController < APIController 
end 
Problemi correlati