2014-10-23 10 views
8

मैं एक आरईएसटी एपीआई बनाने के लिए अंगूर और रेल का उपयोग कर रहा हूं। मेरे पास जगह पर बुनियादी वास्तुकला है और मैं चीजों को 'साफ' करने के लिए स्थानों की तलाश में हूं। उन स्थानों में से एक त्रुटि हैंडलिंग/प्रसंस्करण है।अंगूर त्रुटि प्रबंधन रणनीति?

मैं वर्तमान में पूरे एपीआई के लिए root.rb (GRAPE :: API बेस क्लास) फ़ाइल में त्रुटियों को बचा रहा हूं। मैं उन्हें प्रारूपित करता हूं और फिर त्रुटि को वापस rack_response के माध्यम से भेजता हूं। सब कुछ काम करता है लेकिन root.rb फ़ाइल को सभी त्रुटियों के साथ थोड़ा फूला हुआ हो रहा है और उनमें से कुछ को विशेष पार्सिंग है जो करने की आवश्यकता है। मैं सोच रहा था कि किसी ने त्रुटि प्रबंधन के लिए एक अच्छी रणनीति विकसित की है ताकि इसे अपने स्वयं के मॉड्यूल में स्थानांतरित किया जा सके और root.rb (GRAPE :: API बेस क्लास) को काफी दुबला छोड़ दें।

मैं वास्तव में उदाहरण के लिए एक त्रुटि प्रसंस्करण मॉड्यूल बना सकते हैं और प्रत्येक प्रकार की त्रुटि के लिए तरीकों को परिभाषित करना चाहते हैं ...

module API 
module ErrorHandler 
    def record_not_found 
    rack_response API::Utils::ApiErrors.new({type: e.class.name, message: 'Record not found'}).to_json, 404 
    end 
end 
end 
root.rb फ़ाइल में

तो ऐसा करते हैं

module API 
    class Root < Grape::API 
    prefix 'api' 
    format :json 

    helpers API::ErrorHandler 

    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found # Use the helper method as the handler for this error 
    end 
end 
की तरह कुछ

क्या किसी ने ऐसा कुछ किया है? मैं उपर्युक्त रणनीति के विभिन्न स्वादों की कोशिश कर रहा हूं लेकिन मुझे कुछ भी काम नहीं मिल रहा है।

+0

एक नज़र डालें [यहां] (https://github.com/intridea/grape/issues/177) ऐसा लगता है कि यह एक फीचर अनुरोध था/लेकिन ऐसा लगता है कि लोगों को अब के लिए एक काम मिल गया है। – engineersmnky

+0

वही चीज़ नहीं है जिसे मैं ढूंढ रहा था लेकिन निश्चित रूप से कुछ विचारों को लिंक में सोचने के लिए। धन्यवाद। – mfunaro

उत्तर

5

मैं निम्नलिखित समाधान/रणनीति पर आए हैं ...

मैं निम्नलिखित

module API 
    module Errors 
    extend ActiveSupport::Concern 

    included do 
     rescue_from :all do |e| 
     rack_response API::Utils::ApiErrors.new({type: e.class.name, message: e.message}).to_json, 500 
     end 
     . 
     . 
     . 
    end 
end 

की तरह अपने स्वयं के मॉड्यूल के लिए बचाव सभी त्रुटि चले गए तो मैं बस अपना आधार अंगूर में त्रुटियों में शामिल :: एपीआई वर्ग

module API 
    class Root < Grape::API 
    include API::Errors 

    prefix 'api' 
    format :json 

    helpers API::Utils::Helpers::IndexHelpers 
    helpers API::Utils::Helpers::WardenHelpers 
    helpers API::Utils::Helpers::RecordHelpers 
    . 
    . 
    . 
    end 
end 

प्रयोग का एक बहुत और अन्य काम नहीं कर रहा प्रयास के एक बहुत बाद, मुझे लगता है कि यह एक अच्छा समाधान है और मेरे आधार अंगूर :: एपीआई वर्ग बहुत दुबला बना हुआ है। मैं अभी भी लोगों के किसी भी अन्य दृष्टिकोण के लिए बहुत खुला हूं।

+0

तो क्या आप अपनी सभी त्रुटियों को कोड 500 के साथ प्रस्तुत करते हैं? –

+0

नहीं, मेरे पास 'सभी को पकड़ो' 500 है, लेकिन मैं त्रुटि त्रुटियों के लिए उपयुक्त स्थिति कोड सेट करने वाली अन्य त्रुटियों से बचाव करता हूं। उदाहरण के लिए हम कस्टम अप्राप्य त्रुटियों को बचाते हैं और अपना स्टेटस कोड 422 पर सेट करते हैं। – mfunaro

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