2011-12-09 12 views
10

क्या सिनात्रा डिफ़ॉल्ट नोटफॉउंड त्रुटि पृष्ठ को ओवरराइड करने का कोई तरीका है ("सिनात्रा इस डाटी को नहीं जानता")? मैं सिनात्रा को केवल एक सादा स्ट्रिंग दिखाना चाहता हूं क्योंकि "उचित नहीं मिला" जब उचित मार्ग नहीं मिलता है, लेकिन जब मैं मार्ग के अंदर से 404 त्रुटि उठाता हूं तो मैं चाहता हूं कि यह पारित त्रुटि संदेश दिखाए।सिनात्रा डिफ़ॉल्ट ओवरराइड त्रुटि पृष्ठ

इस तरह not_found ब्लॉक को लागू:

get '/' do 
    begin 
     # some processing that can raise an exception if resource not found 
    rescue => e 
     error 404, e.message.to_json 
    end 
    end 
:

not_found do 
    'Method not found.' 
    end 

काम करता है, लेकिन इसकी नहीं एक मान्य विकल्प के बाद से मैं इस तरह मार्गों से अपने ही NotFound त्रुटि संदेश फेंक करने में सक्षम होना चाहता हूँ

लेकिन जैसा कि अपेक्षित नहीं है_फॉउंड ब्लॉक मेरे त्रुटि संदेश को ओवरराइड करता है।

उत्तर

0

कोई बात नहीं, पाया गया कि सभी मार्गों, क्रम में मिलान किया जाता है तो सभी मार्गों के बाद मैं get/post/put/delete '*' do ; end रख दिया और है कि मेरी समस्या का हल।

5

आप अपने मार्ग में त्रुटि हैंडलिंग का उपयोग नहीं करते हैं, तो आप उपयोग कर सकते हैं इस तरह error मार्ग (लिया और Sinatra: Up and Running किताब से संशोधित)

require 'sinatra' 

configure do 
    set :show_exceptions, false 
end 

get '/div_by_zero' do 
    0/0 
    "You won't see me." 
end 

not_found do 
    request.path 
end 

error do 
    "Error is: " + params['captures'].first.inspect 
end 

वहाँ एक पैरामीटर captures कि रखती है में बनाया अपने त्रुटि। आप इसे params['captures'] के माध्यम से एक्सेस कर सकते हैं। यह एक सरणी है, और मेरे परीक्षणों में इसमें एक तत्व होगा, जो त्रुटि ही थी (स्ट्रिंग नहीं)।

Here is information on the request object.

+0

मैं, जो काम करता है लेकिन बेजोड़ मार्गों के लिए नहीं, इसलिए यदि आपके पास पोस्ट किए गए जैसा कोई पापरात्रा एप्लिकेशन है और उदाहरण के लिए पहुंचने का प्रयास करें, तो यह/i_is_not_a_present_route' मैं अभी भी त्रुटि संदेश के बजाय डिफ़ॉल्ट sinatra पृष्ठ देखता हूं। –

+1

तो यदि आपके पास एक अस्तित्वहीन मार्ग का अनुरोध है, तो 'not_found' मार्ग का उपयोग करें। अनुरोध ऑब्जेक्ट में, 'request.path' है जो आपको आपके उदाहरण में' this_is_not_a_present_route' 'देगा। मैंने भी उदाहरण अपडेट किया। –

+0

हाय, समस्या यह है कि अंदरूनी मार्गों से उठाए गए अन्य 404 त्रुटि संदेशों को ओवरराइड न करें। इस तरह यह अनुरोधित पथ तक पहुंचने का प्रयास करते समय request.path को हमेशा प्रस्तुत करेगा, लेकिन अगर यह अंदरूनी मार्गों से कुछ 404 त्रुटि उठाई जाती है तो उसे दिखाएगा। –

13

शायद the accepted answer में प्रस्तावित है कि तुलना में एक अधिक सुंदर समाधान नहीं बल्कि error(404) या not_found शैलियों का उपयोग करने से केवल Sinatra::NotFound को बचाने के लिए, है।

error Sinatra::NotFound do 
    content_type 'text/plain' 
    [404, 'Not Found'] 
end 

यह "सिनात्रा यह छोटा गीत पता नहीं है" मार्गों कि आप निर्धारित नहीं किया है के लिए डिफ़ॉल्ट पृष्ठ से बचाता है, लेकिन स्पष्ट return [404, 'Something else'] शैली प्रतिक्रियाओं के रास्ते में नहीं है।

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