次のエラーが発生しました。
ActionController::RoutingError (No route matches [GET] "/images/favicon.ico")
存在しないリンクのerror404ページを表示したい。
どうすればそれを達成できますか?
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
@Andrey Deineko、あなたのソリューションは、コントローラー内で手動で発生したRoutingError
sに対してのみ機能するようです。 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
コピーfavicon image in app/assets/images
私のために働いた。