web-dev-qa-db-de.com

rescue_from ActionController :: RoutingError in Rails 4

Ich habe folgenden Fehler erhalten:

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

Ich möchte die error404-Seite für Links anzeigen, die nicht vorhanden sind.

Wie kann ich das erreichen?

19
Anna

In application_conroller.rb fügen Sie Folgendes hinzu: 

  # 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

Ich rette normalerweise auch folgende Ausnahmen, aber das liegt an Ihnen:

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

Erstellen Sie den Fehlercontroller:

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

Dann in 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

Und das Letzte ist, not_found.html.haml (oder was auch immer Sie als Template-Engine verwenden) unter /views/errors/ zu erstellen:

  %span 404
  %br
  Page Not Found
54
Andrey Deineko

@Andrey Deineko, deine Lösung scheint nur für die RoutingErrors zu funktionieren, die manuell in einem Controller erstellt werden. Wenn ich es mit der URL my_app/not_existing_path versuche, erhalte ich immer noch die Standardfehlermeldung.

Ich vermute, das liegt daran, dass die Anwendung die Controller nicht einmal erreicht, da Rails den Fehler zuvor auslöst.

Der Trick der das Problem gelöst hat, war für mich die folgende Zeile am ende der Routen:

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

um alle nicht vordefinierten Anforderungen abzufangen.

Dann können Sie im ErrorsController respond_to verwenden, um Anforderungen in den Bereichen HTML, Json ... zu liefern:

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
1
Misu

Ich habe diesen Fehler erhalten. Ich habe favicon image in app/assets/images kopiert und es funktioniert für mich.

1
Anuja