2016-04-27 1 views
6

हाय मैं एक ऐप के लिए एपीआई अनुभाग बना रहा हूं। मेरे सभी एपीआई संबंधित नियंत्रक app/controllers/api निर्देशिका के अंदर रहते हैं।skip_before_action?

मेरी चिंता यह है कि application_controller में before_action :authenticate_user! फ़िल्टर है, इसलिए मुझे एपीआई तक पहुंचने के लिए लॉगिन मोड में होना होगा।

मेरे वर्तमान समाधान: मैं सभी नियंत्रकों जो app/controllers/api निर्देशिका में हैं में skip_before_action :authenticate_user! जोड़ रहा ..

समस्या: मैं सभी नियंत्रकों में लिखने के लिए है और मैं लगभग 80 नियंत्रकों

है

मेरे उम्मीद: है वहाँ एक रास्ता है, जहां मैं application_controller में की तरह ही इस ख कुछ लिख सकते हैं efore_action: authenticate_user !, को छोड़कर: [all the controllers which are in api directory]

+0

http://stackoverflow.com/a/11785449/2231236 लागू इसी तरह – Nithin

उत्तर

2

आप इस तरह की कोशिश कर सकते हैं अगर सभी नियंत्रकों एपीआई फ़ोल्डर के अंतर्गत कर रहे हैं:

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

आप यह सुनिश्चित करें कि 'पैरामीटर [हैं : नियंत्रक] 'पथ शामिल है, न केवल नियंत्रक का नाम? –

+1

@ArslanAli, हां हम पुल पथ प्राप्त करेंगे यदि नियंत्रकों को वर्ग एपीआई :: पासवर्ड कंट्रोलर Thorin

7

आप हर नियंत्रक जिनके कार्य नहीं जा सकते प्रमाणीकृत करने में skip_before_action :authenticate_user! निर्दिष्ट करने के लिए होगा। आप skip_before_action विधि के लिए तर्क के रूप में नियंत्रक का नाम या किसी भी चीज़ को पास नहीं कर सकते हैं।

एक समाधान है: आप एक नियंत्रक APIController कहा जाता है कर सकते हैं, और आप वहाँ skip_before_action बात निर्दिष्ट कर सकते हैं की तरह है:

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

और फिर सब app/controllers/api/ पर नियंत्रक APIController से विरासत कर सकते हैं।

class OtherController < APIController 
end