2010-07-29 17 views
10

मेरे पास एक रेल ऐप है जिसमें एक JSON API इंटरफ़ेस शामिल है। जब मान सही तरीके से निर्दिष्ट होते हैं, तो नियंत्रक खुश पथ को ठीक से संभालता है और जेएसओएन आउटपुट के रूप में प्रस्तुत किया जाता है।मैं अपने रेल रीस्ट एपीआई में त्रुटियों या बुरे अनुरोधों को कैसे संभाल सकता हूं?

हालांकि, अगर इनपुट में कोई समस्या है, तो एक अपवाद उठाया जाता है और rescues में कुछ टेम्पलेट्स इसके बजाए प्रस्तुत किए जाते हैं। मैं वास्तव में { "error": { "msg": "bad request", "params": ... } } और उचित HTTP स्थिति कोड (जैसे 403 अगर उन्हें प्रमाणीकृत नहीं किया गया था) के साथ एक JSON त्रुटि वापस करना चाहूंगा। लेकिन मैं केवल example.com/api/... में किसी भी चीज़ के खिलाफ अनुरोधों पर लागू होना चाहता हूं।

मैं यह कैसे कर सकता हूं?

उत्तर

4

आपके एपीआई नियंत्रक पर around_filter के बारे में कैसे। जैसे

around_filter :my_filter 

private 
def my_filter 
    begin 
    yield 
    rescue 
    render :js => ... 
    end 
end 
13

कुछ मैं एक ऐसी ही मामला था, लेकिन मैं व्यक्तिगत एपीआई तरीकों अलग से बचाया क्योंकि मैं विधि विशिष्ट त्रुटियों की जरूरत है, मैं भी त्रुटि प्रकार के आधार पर कई बचाव हो सकता था।

अपने आवेदन नियंत्रक में, मैं एक विधि था:

def error(status, code, message) 
    render :js => {:response_type => "ERROR", :response_code => code, :message => message}.to_json, :status => status 
end 

तब मेरे एपीआई नियंत्रक

def some_method 
    ## do stuff 
rescue 
    error(500, method_specific_error_code, "it all done broke") 
    ## additional error notifications here if necessary. 
end 

में क्योंकि मैं त्रुटि बचाव, मैं स्पष्ट रूप से भेक api के लिए कॉल करने के लिए की जरूरत है।

def render_404 
    error(404, 404, "Unknown method") 
end 

मुझे आशा है कि इस मदद करता है:

प्रमाणीकरण संभाल करने के लिए, मैं 404 त्रुटियों को बचाने के लिए login_required

def login_required 
    error(403, 403, "Not Authenticated") unless authenticated 
end 

और के लिए एक before_filter था!

+0

मैं भी इस पर आपसे सहमत हूं क्योंकि विभिन्न कार्यों के लिए कस्टम त्रुटियों को प्रस्तुत करने का यह सबसे अच्छा तरीका है –

+0

बस एक नोट, लेकिन आप इसके बजाय 'प्रस्तुत करना' : जेएस => {...} ' –

संबंधित मुद्दे