17

मैं निम्न त्रुटि मिल गया है:rescue_from ActionController :: रेल में RoutingError 4

ActionController::RoutingError (No route matches [GET] "/images/favicon.ico") 

मैं उन लिंक को मौजूदा नहीं कर रहे हैं के लिए error404 पेज दिखाना चाहते हैं।

मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

51

application_conroller.rb में निम्नलिखित जोड़ें:

# You want to get exceptions in development, but not in production. 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from ActionController::RoutingError, with: -> { render_404 } 
    end 

    def render_404 
    respond_to do |format| 
     format.html { render template: 'errors/not_found', status: 404 } 
     format.all { render nothing: true, status: 404 } 
    end 
    end 

मैं आमतौर पर भी निम्न अपवादों को बचाने, लेकिन यह आप पर निर्भर है:

rescue_from ActionController::UnknownController, with: -> { render_404 } 
rescue_from ActiveRecord::RecordNotFound,  with: -> { render_404 } 

त्रुटियों नियंत्रक बनाएँ:

class ErrorsController < ApplicationController 
    def error_404 
    render 'errors/not_found' 
    end 
end 

फिर routes.rb

में
unless Rails.application.config.consider_all_requests_local 
    # having created corresponding controller and action 
    get '*path', to: 'errors#error_404', via: :all 
    end 

और अंत में बनाने के लिए है not_found.html.haml (या जो भी टेम्पलेट इंजन का उपयोग) /views/errors/ के तहत:

%span 404 
    %br 
    Page Not Found 
+4

इस रेल 4.2.5 में काम नहीं करता। मुझे लगता है कि ऐसा इसलिए है क्योंकि किसी भी नियंत्रक कोड को चलाने से पहले अपवाद को एक्शनडिस्चैच द्वारा उठाया जाता है। – depquid

+0

@depquid मैंने इसे Rails 4.0.x के समय लिखा था, लेकिन रेलवे 4.2.5 के साथ इसका परीक्षण किया है - मुझे लगता है कि आपने मार्ग नहीं जोड़ा है और 'error_controller.rb' नहीं बनाया है :) यदि ऐसा है - कृपया डाउनवोट को वापस लेना सुनिश्चित करें, जब तक कि आपके पास –

+6

छोड़ने के अधिक कारण न हों, क्षमा करें, मैंने मार्ग को सही तरीके से सेट नहीं किया है। लेकिन क्यों है, 'action_ontroller :: routingError से बचाव करें: -> {render_404} 'यदि आप सीधे कार्रवाई पर रूटिंग कर रहे हैं? – depquid

2

मैं इस त्रुटि हो रही थी। मैंने फेविकॉन छविapp/assets/images में कॉपी किया और यह मेरे लिए काम कर रहा है।

-2

@Andrey Deineko, अपने समाधान एक conrtoller अंदर मैन्युअल उठाया RoutingError रों के लिए ही काम करने के लिए लगता है। अगर मैं यूआरएल my_app/not_existing_path के साथ कोशिश करता हूं, तो मुझे अभी भी मानक त्रुटि संदेश मिलता है।

मुझे लगता है कि यह इसलिए है क्योंकि एप्लिकेशन नियंत्रकों तक भी नहीं पहुंचता है, क्योंकि रेल पहले त्रुटि उठाते हैं।

trick कि समस्या हल हो मेरे लिए मार्गों की अंत पर निम्न पंक्ति जोड़ने के लिए किया गया था:

Rails.application.routes.draw do 
    # existing paths 
    match '*path' => 'errors#error_404', via: :all 
end 

सभी पूर्वनिर्धारित नहीं अनुरोधों को पकड़ने के लिए।

फिर ErrorsController में आप एचटीएमएल, json ... अनुरोध का उत्तर देने के लिए respond_to उपयोग कर सकते हैं:

class ErrorsController < ApplicationController 
    def error_404 
    @requested_path = request.path 
    repond_to do |format| 
     format.html 
     format.json { render json: {routing_error: @requested_path} } 
    end 
    end 
end 
+0

क्या आप '@requested_path = request.path' और इसके संबंधित कॉल 'format.json {रेंडर जेसन: {routing_error: @requested_path}} की व्याख्या कर सकते हैं? –

+0

मैंने अभी टेम्पलेट में '@ request_path' का उपयोग किया है (error_404.html.haml)। जेसन के लिए, अगर मुझे यकीन है कि मैं एक पूर्ण पृष्ठ वापस नहीं चाहता हूं, उदाहरण के लिए AJAX द्वारा, मैं जेसन वापस लौटने के लिए कह सकता हूं, और त्रुटि संदेश प्राप्त कर सकता हूं – Misu

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