2012-03-10 16 views
13

के लिए MissingTemplate अपवाद रेल 3.0 के साथ शुरू, समय-समय पर, मैं इस तरह एक अपवाद सूचना प्राप्त करने के लिए किया गया है:दबा ActionView :: रेल 3.x

ActionView::MissingTemplate: Missing template [...] with {:locale=>[:en], 
    :formats=>[:text], :handlers=>[:erb, :builder, :haml]}. Searched in: * [...] 

उदाहरण के लिए, एक मनमाना हाथ से लिखा http://example.com/some/path/robots.txt जैसे यूआरएल त्रुटि उठाता है। मज़ा नहीं।

मैंने बहुत पहले इस टिकट में समस्या की सूचना दी थी, और यहां वर्णित पैच का उपयोग कर रहा हूं, लेकिन समस्या बनी हुई है।

https://rails.lighthouseapp.com/projects/8994/tickets/6022-content-negotiation-fails-for-some-headers-regression

फिक्स इस ब्लॉग पोस्ट में सुझाव दिया है,

http://trevorturk.wordpress.com/2011/12/09/handling-actionviewmissingtemplate-exceptions/

इस का उपयोग करने के लिए:

लेकिन यह मैं के रूप में मेरे लिए सही नहीं लगता है, मैं कई प्रारूपों के साथ एक कार्रवाई अधिभार में रुचि नहीं है। मेरे ऐप में, एचटीएमएल और जेएसओएन एपीआई के लिए अलग-अलग यूआरएल हैं, इसलिए render इतना आसान होना चाहिए।

क्या मुझे बस rescue_from ActionView::MissingTemplate द्वारा अपवाद निगलना चाहिए और 406 खुद को वापस करना चाहिए?

क्या इस स्थिति को संभालने का कोई बेहतर तरीका है?

या मैं इस तरह से पूछ सकते हैं - पहली जगह में, वहाँ उत्पादन पर अपवाद के इस प्रकार को ऊपर उठाने में किसी भी वास्तविक दुनिया उपयोगिता है?

उत्तर

5

यदि आपको प्रारूपित मार्गों की आवश्यकता नहीं है तो आप उन्हें अपने मार्ग विनिर्देश में प्रारूप:> == के साथ अक्षम कर सकते हैं।

get '/products' => 'products#index', :format => false 

इससे रूटिंग एरर उत्पन्न होगा जो 404 नहीं मिला है।

get '/products' => 'products#index', :format => /(?:|html|json)/ 

आप एक URL का प्रारूप चाहते हैं, लेकिन यह एक एकल प्रारूप के लिए प्रतिबंधित चाहते हैं तो आप ऐसा कर सकते:

get '/products.json' => 'products#index', :format => false, :defaults => { :format => 'json' } 

एक संख्या हैं वैकल्पिक रूप से आप यह पूर्वनिर्धारित प्रारूपों के एक नंबर करने के लिए सीमित कर सकते हैं उत्पादन में इस त्रुटि को बढ़ाने के वैध कारणों के लिए - उदाहरण के लिए तैनाती से एक लापता फ़ाइल या शायद आप अपने आवेदन के यूआरएल को हैक करने की कोशिश कर रहे किसी व्यक्ति की अधिसूचना चाहते हैं।

+6

धन्यवाद। इस बिंदु पर मेरा निष्कर्ष यह है कि अधिकांश समस्या 'प्रारूप' के साथ है। क्या 'प्रारूप' को पूरी तरह अक्षम करने का कोई तरीका है? मैं प्रत्येक परिभाषा में ': format => false' जोड़ना नहीं चाहता हूं। – kenn

0

यदि विशिष्ट पथ हैं जिन्हें समय-समय पर त्रुटियों को उत्पन्न करने के लिए कहा जाता है - और वे नियमित रूप से बुलाए जाने वाले यूआरएल का एक ही सेट होते हैं (यानी, robots.txt या जो भी हो) - यदि आप कर सकते हैं तो सबसे अच्छी बात यह है शुरू करने के लिए अपने रेल सर्वर को मारने से उन्हें खत्म करने के लिए।

यह कैसे करें आपके सर्वर स्टैक पर निर्भर करता है। ऐसा करने का एक तरीका यह है कि यूआरएल रेल में पारित होने से पहले इसे सीधे RACK में अवरुद्ध करें।

एक और तरीका है nginx या यूनिकॉर्न में अवरोधित करना, निर्भर करता है आप अपने अनुप्रयोग के लिए उपयोग कर रहे हैं जो वेब श्रोता पर हो सकता है।

मैं इस की जांच कर रहे है और फिर वापस आ रहा है और यहां पर एक अतिरिक्त प्रश्न पोस्ट करने की सलाह देते हैं 'कैसे यूआरएल रैक का उपयोग कर ब्लॉक करने के लिए?"(या यूनिकॉर्न या nginx या जहां भी आपको लगता है कि यह पहुंच को अवरुद्ध करने के लिए समझ में आता है।

+0

मुझे नहीं लगता कि यह इस तरह की समस्याओं को संभालने का एक स्थायी तरीका है, क्योंकि इस समस्या की प्रकृति दोहराव नहीं है लेकिन यादृच्छिक है। आप समय-समय पर देखेंगे बहुत अजीब यूआरएल हिट हो जाते हैं। मेरे पास अवांछित अनुरोधों को सीमित करने या त्यागने के लिए कुछ Nginx सेटिंग्स हैं, लेकिन यह टिकट नहीं है। – kenn

1

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

app/views/some/path/robots.txt.erb 

आप इसे करने के लिए बस

app/views/some/path/robots.erb 

सोचा था की कुछ स्कूलों का कहना है कि यह एक है बदल सकते हैं बुरी बात यह है कि आप एक अलग फॉर्म में डेटा लौट रहे हैं टी से अनुरोध किया गया था, हालांकि व्यावहारिक रूप से उपयोगकर्ता एजेंटों का बहुत बुरा व्यवहार कर रहे हैं, हर साइट सावधानी से सामग्री प्रकार के अनुरोधों को फ़िल्टर नहीं करती है, और लगातार वही चीज़ लौटाने का अनुमान लगाया जा सकता है, इसलिए मुझे लगता है कि यह जाने का एक उचित तरीका है।

2

कुछ स्रोत डाइविंग के बाद मुझे एक और तरीका मिला। इसे प्रारंभिक में रखें।

ActionDispatch::ExceptionWrapper.rescue_responses.merge! 'ActionView::MissingTemplate' => :not_found 
1

अपने विधि के अंत में

render nothing: true 

जोड़ने का प्रयास करें।

3

बेस्ट कि मेरे लिए काम किया application_controller.rb में है:

rescue_from ActionView::MissingTemplate, with: :not_found 
+0

यह जोखिम भरा है क्योंकि यदि आप टेम्पलेट नाम टाइप करते हैं तो आपको उत्पादन पर कोई त्रुटि दिखाई नहीं देगी। –