2016-04-27 5 views
6

Hallo ich baue eine API-Sektion für eine App. Meine alle API-Controller befindet sich im Verzeichnis app/controllers/api.skip_before_action für einige Controller in Rails?

Meine Sorge ist, dass in application_controller gibt es einen Filter before_action :authenticate_user!, so muss ich im Login-Modus auf die API zugreifen.

Meine aktuelle Lösung: I skip_before_action :authenticate_user! in allen Controllern bin Zugabe, die in app/controllers/api finden ..

Problem: Ich habe in all den Controllern zu schreiben, und ich habe etwa 80 Controller

Meine Erwartung: gibt es eine Möglichkeit, wo ich in application_controller selbst so etwas wie dies b schreiben efore_action: authenticate_user !, außer: [all the controllers which are in api directory]

+0

http://stackoverflow.com/a/11785449/2231236 implementieren ähnlich – Nithin

Antwort

2

Sie können wie diese versuchen, wenn alle Controller unter Ordner API sind:

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

Sind Sie sicher, dass 'params [ : controller] 'enthält den Pfad und nicht nur den Namen des Controllers? –

+1

@ArslanAli, Ja, wir werden Pull-Pfad erhalten, wenn Controller wie Klasse Api :: PasswordsController Thorin

7

Sie haben skip_before_action :authenticate_user! in jedem Controller, deren Aktionen angeben sollen nicht authentifiziert werden. Sie können den Namen des Controllers oder eine andere Sache nicht als Argument an die Methode skip_before_action übergeben.

Eine Lösung ist: Sie können einen Controller machen genannt APIController, und Sie können die skip_before_action, was es gerne angeben:

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

Und dann alle Regler auf app/controllers/api/ aus APIController erben.

class OtherController < APIController 
end 
Verwandte Themen