22

अनुकूलित त्रुटि पृष्ठों से निपटने बनाने के लिए कई समाधान कर रहे हैं, लेकिन रेल के लिए लगभग कोई भी 4:रेल 4: मैं एक कस्टम 404 पृष्ठ कैसे बना सकता हूं जो संपत्ति पाइपलाइन का उपयोग करता है?

लोगों को प्रोत्साहित करने के मानक जवाब /public नहीं करता है में 404.html संशोधित करने के लिए ' मेरे लिए काम नहीं करता क्योंकि मैं संपत्ति पाइपलाइन में रहने वाली सीएसएस थीम का उपयोग करना चाहता हूं। क्या कोई तरीका है कि एचटीएमएल फाइलें संपत्ति पाइपलाइन में परिभाषित उन शैलियों तक पहुंच सकती हैं? यदि नहीं, तो वहाँ एक कस्टम त्रुटि हैंडलर पाइप लाइन तक पहुंच है, बनाने के लिए एक तरीका है?

+0

मुझे लगता है कि आपके दूसरे संदर्भ में आप क्या चाहते हैं। ** लेकिन रेल 4 ** के लिए लगभग कोई नहीं, क्या आप वाकई दूसरे संदर्भ रेल 4 पर काम नहीं करते हैं? आपने पहले ही क्या किया है? –

उत्तर

5

हमने एक मणि बनाया है जो आपके लिए यह करता है: exception_handler

वहाँ भी एक महान ट्यूटोरियल here है।

मैं भी विषय here पर एक व्यापक जवाब लिखा।

मिडिलवेयर

# config/application.rb 
config.exceptions_app = ->(env) { ExceptionController.action(:show).call(env) } 

नियंत्रक

# app/controllers/exception_controller.rb 
class ExceptionController < ApplicationController 
    respond_to :json, :js, :html 
    before_action :set_status 

    def show 
    respond_with @status 
    end 

    private 

    def set_status 
    def status 
     @exception = env['action_dispatch.exception'] 
     @status = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code 
     @response = ActionDispatch::ExceptionWrapper.rescue_responses[@exception.class.name] 
    end 
    end 
end 

देखें

# app/views/exception/show.html.erb 
<h1>404 error</h1> 

यह बहुत सरल versi यदि आप चाहें तो मैं और अधिक समझा सकता हूं।

मूल रूप से, आप config.exceptions_app मिडलवेयर में हुक करने की जरूरत है, यह middleware ढेर में किसी भी अपवाद (के रूप में सम्पूर्ण परिवेश प्रतिपादन के खिलाफ) पर कब्जा होगा, आप अपने खुद controller#action लिए अनुरोध भेजने के लिए अनुमति देता है।

आप टिप्पणी करते हैं, तो मैं तुम्हें बाहर कुछ और अगर आप चाहते हैं आपकी मदद करेंगे!

+1

'कक्षा अपवाद नियंत्रक <अनुप्रयोग नियंत्रक' अन्यथा त्रुटि –

+0

रेल संस्करण के साथ कुछ लेना देना नहीं है। यह सम्मेलन है। नियंत्रक को 'NameController' कहा जाता है और फिर आप फ़ाइल 'name_controller.rb' नाम देते हैं। रेल 'नाम नियंत्रक' की तलाश में है। यदि आप इसे केवल 'वर्ग नाम' कहते हैं तो इसे 'निरंतर नाम नियंत्रक को स्वत: लोड करने में असमर्थ' (क्योंकि वह नाम नियंत्रक की अपेक्षा करता है लेकिन इसे नहीं ढूंढ सकता) –

36

रेल 4.1 के लिए मैं this answer, add an asset type बेहतर पसंद है; हालांकि मैंने कोशिश नहीं की है। रेल 4.0.8 पर, इन तीन संदर्भ मुझे मदद मिली:

  1. Dynamic error pages प्रश्न में दूसरा संदर्भ है। यह मेरे लिए बस ठीक काम किया।

  2. Custom error pages पहले संदर्भ से या दूसरी तरफ से पकड़ा गया हो सकता है, लेकिन कैपिबरा के साथ परीक्षण के बारे में कुछ जानकारी जोड़कर अतिरिक्त मील चला जाता है।

  3. मैं Capybara परीक्षण नहीं किया क्योंकि मैं परीक्षण विन्यास को बदलने के लिए नहीं करना चाहता था; हालांकि, RSpec-Rails Request Specs ने इन अनुरोधों को स्वतंत्र रूप से जांचने के लिए चिपकाया और देखा कि वे सही सामग्री को पूरा और वापस कर देते हैं।

    1. निम्नलिखित सेटिंग, config/routes.rb को config/environments/production.rb

      # Route exceptions to the application router vs. default 
      config.exceptions_app = self.routes 
      
    2. संपादित में जोड़े रूटिंग कॉन्फ़िगरेशन:

    क्या इस प्रकार है क्या तीन संदर्भ द्वारा पढ़ाया जा रहा है की संक्षेप वर्णन है त्रुटि पृष्ठों को एक त्रुटि नियंत्रक

    पर निर्देशित करें 0
    # error pages 
        %w(404 422 500 503).each do |code| 
        get code, :to => "errors#show", :code => code 
        end 
    

    से रूट किया जाएगा एक पैरामीटर code स्थिति कोड का मूल्य होता है साथ errors नियंत्रक के show कार्रवाई करने के लिए 404, 422, 500, और 503 पृष्ठ अनुरोधों।

  4. नियंत्रक, app/controllers/errors_controller.rb बनाएं। यहाँ संपूर्ण सामग्री है:

    class ErrorsController < ApplicationController 
    
        def show 
        status_code = params[:code] || 500 
        flash.alert = "Status #{status_code}" 
        render status_code.to_s, status: status_code 
        end 
    
    end 
    

    मेरी प्राथमिकता flash.alert

  5. पर एक स्थिति संदेश सेट करने के लिए पृष्ठों में उनसे बनाएं था। मैं का उपयोग .erb यहाँ app/views/errors/500.html.erb

    <p>Our apology. Your request caused an error.</p> 
    <%= render 'product_description' %> 
    

    तो आप देखते हैं कि आप एक आंशिक प्रदान कर सकते हैं है। पृष्ठ app/views/layouts/application.html.erb या आपके द्वारा कॉन्फ़िगर किए गए किसी अन्य लेआउट बॉयलरप्लेट से सभी लेआउट बॉयलरप्लेट के साथ प्रस्तुत करता है। इसमें <div id='alert'><%= alert %></div> शामिल है जो फ़्लैश से स्थिति संदेश प्रदर्शित करता है।

  6. एक परीक्षण फ़ाइल, spec/requests/errors_request_spec.rb जोड़कर आरएसपीसी के साथ परीक्षण किया गया।

    require 'rails_helper' 
    
    RSpec.describe "errors", :type => :request do 
    
        it "displays the 500 page" do 
        get "/500" 
        assert_select 'div#alert', 'Status 500' 
        assert_select 'div[itemtype]' 
        end 
    
    end 
    

    पहले फ्लैश चेतावनी के लिए दावे की जाँच करता: यहाँ है कि फ़ाइल की सामग्री है कि 500 ​​स्थिति पृष्ठ का एक परीक्षण से पता चलता संक्षिप्त है। आंशिक के लिए दूसरा दावा जांच करता है।

+1

संपत्ति पाइपलाइन समाधान के साथ केवल एक समस्या है। प्रत्येक एचटीएमएल फ़ाइल पाचन के साथ घिरा हुआ है और इस प्रकार डिस्पैचर :: PublicExceptions से खोजने में मुश्किल होती है। मैं लोगों को यहां उल्लेखित एक कोशिश करने की सलाह देता हूं। – Kristoffer

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

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