2009-06-03 12 views
7

रेल में गतिशील, कस्टम त्रुटि पृष्ठों को कैसे लागू किया जाता है?एक कैसे गतिशील 404, 500, इत्यादि रेल में त्रुटि पेज लागू करता है?

उदाहरण के लिए अपने application.html.erb लेआउट और पृष्ठ में कुछ गतिशील फ़ील्ड का उपयोग कर एक कस्टम 404 त्रुटि पृष्ठ।

इसके अलावा, स्थानीय मशीन से इसका परीक्षण कैसे किया जाता है?

उत्तर

6

Henrik Nyh's post देखें। अन्य भी Google के माध्यम से मिल सकते हैं।

पीछे विचार: रेल 404 त्रुटियों के लिए public/404.html प्रस्तुत करना प्रतीत होता है।

  • फिर आप पेज के ऊपर लिख सकता है अगर आप एक स्थिर क्षेत्र
  • प्रदर्शित करने के लिए गतिशील सामग्री के लिए चाहते हैं, यह आप में हुक और अपने गतिशील पेज रेंडर करने के लिए पुनर्निर्देशित करने के लिए एक रूपरेखा विधि ओवरराइड कर सकते हैं लगता है।

ActionController::Rescue एक rescue_action_in_public कि render_optional_error_file कॉल परिभाषित करता है।

+8

रेल नहीं 3 दोस्ताना – AnApprentice

+1

@AnApp हो सकता है .. यह एक पुराना उत्तर है - आप रेल 3 संस्करण को एक अलग उत्तर के रूप में पोस्ट कर सकते हैं। – Gishu

+4

रेल 3 संस्करण क्या है? –

9

बस जोड़ने के अपने ApplicationController के लिए निम्न:

rescue_from ActiveRecord::RecordNotFound, :with => :render_record_not_found 

    # Catch record not found for Active Record 
    def render_record_not_found 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

    # Catches any missing methods and calls the general render_missing_page method 
    def method_missing(*args) 
    render_missing_page # calls my common 404 rendering method 
    end 

    # General method to render a 404 
    def render_missing_page 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

आप रेंडर कॉल अनुकूलित कर सकते हैं (अपने टेम्पलेट का उपयोग, एक लेआउट आदि का उपयोग करें) और पकड़ त्रुटियों इस तरह से। अब यह आपके लिए गायब विधि और record_not_found पकड़ता है, लेकिन शायद ऐसे मामले हैं जहां आप 500 त्रुटि पृष्ठ प्रदर्शित करना चाहते हैं ताकि आप आगे बढ़ सकें, इस दृष्टिकोण का उपयोग करें और इसे आपके लिए उपयुक्त बनाएं।

स्थानीय मशीन से परीक्षण के लिए, यह बस इसी तरह काम करता है। यदि आप केवल उत्पादन मोड में काम करना चाहते हैं, तो

if ENV['RAILS_ENV'] == 'production' 

और आप ठीक हैं।

+0

रेल 3.1 पर यह सामान्य 404 पृष्ठों के लिए मेरे लिए काम नहीं कर रहा है, केवल रिकॉर्ड के लिए नहीं। इसके बजाए यह सार्वजनिक/404.html से खींचता रहता है और यदि वह फ़ाइल गुम है तो यह सिर्फ एक खाली पृष्ठ प्रस्तुत करती है। –

3

आप एक गतिशील 404 (या अन्य स्थिति कोड) पेज (यदि वह मौजूद) /public से इसी html फ़ाइल निकालने का ध्यान रखें

13

मैं पर कैसे गूगल पर कुछ ब्लॉग पोस्ट को देखा बनाने का फैसला करते हैं ऐसा करने के लिए, दुर्भाग्य से अधिकांश आपके एप्लिकेशन नियंत्रक को प्रदूषित करने पर भरोसा करते हैं।

क्या मैं बजाय किया 404 संदेश के साथ एक खाका बनाने के लिए तो एक रेक कार्य से सार्वजनिक/404.html फ़ाइल अद्यतन करने के लिए है कि टेम्पलेट का उपयोग किया गया था: जब भी मैं अपने वैश्विक लेआउट अद्यतन अब

# Rake file to generate static 404 page 

file "public/404.html" => ["app/views/layouts/application.html.erb"] do |t| 
    print "Updating 404 page\n" 
    `curl --silent http://locahost/content/error404 -o public/404.html` 
end 

404 पेज स्वचालित रूप से अपडेट हो जाता है।

1

परीक्षण मोर्चे पर, ऐसा करने का वास्तव में एक अच्छा तरीका (विकास उद्देश्यों के लिए, कम से कम) यात्री का उपयोग करना और रेल पर्यावरण को उत्पादन में सेट करना (या साइट कॉन्फ़िगरेशन में "RailsEnv विकास" को टिप्पणी करना) है। कम से कम इस तरह आप नकल कर सकते हैं कि यह उत्पादन में कैसे काम करता है।

लेकिन, ऐसा करने के लिए, मेरे पास कई प्रकार की सेटिंग्स फ़ाइलें हैं जो स्टार्टअप पर पार्स हो जाती हैं और पर्यावरण के आधार पर उठाई जाती हैं। सेटिंग्स में से एक यह है कि त्रुटि पृष्ठों को दिखाने के लिए (AppSettings.show_page_errors?)।तब मेरे आवेदन नियंत्रक में, मैं

if !AppSettings.show_page_errors? 
    alias_method :rescue_action_locally, :rescue_action_in_public 
    end 

तो, यह आम तौर पर डिफ़ॉल्ट सेटिंग्स पर सेट कर दिया जाता है, लेकिन कभी कभी मैं वास्तव में देखने के लिए वास्तव में क्या हो रहा है की जरूरत है, तो मैं उत्पादन पर इसे बंद कर सकते हैं।

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

def render_optional_error_file(status_code) 
    status = interpret_status(status_code) 
    render :template => "/errors/#{status.to_s[0,3]}.html.haml", :status => status, :layout => 'application.html.haml' if [404, 422, 500].include?(status) 
    render :template => "/errors/unknown.html.haml", :status => status, :layout => 'application.html.haml' unless [404, 422, 500].include?(status) 
end 

इस टेम्पलेट का उपयोग कर स्थिति कोड 404, 422, और 500 प्रस्तुत करना होगा, लेकिन अन्यथा यह अज्ञात उपयोग करता है। अगर आपको दूसरों को संभालने की ज़रूरत है, तो यह सिर्फ इस विधि को अपडेट करने और टेम्पलेट जोड़ने का मामला है।

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