web-dev-qa-db-ja.com

rescue_from ActionController :: RoutingError in Rails 4

次のエラーが発生しました。

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

存在しないリンクのerror404ページを表示したい。

どうすればそれを達成できますか?

22
Anna

application_controller.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
56
Andrey Deineko

@Andrey Deineko、あなたのソリューションは、コントローラー内で手動で発生したRoutingErrorsに対してのみ機能するようです。 my_app/not_existing_pathというURLで試しても、標準エラーメッセージが表示されます。

Railsは以前にエラーを発生させていたため、アプリケーションがコントローラーに到達しなかったためだと思います。

トリック は、私のために問題を解決し、次の行を追加することでした 終わり ルートの:

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

事前定義されていないリクエストをすべてキャッチします。

次に、ErrorsControllerでrespond_toを使用して、html、json ...リクエストを処理できます。

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

コピーfavicon image in app/assets/images私のために働いた。

2
Anuja