私は現在 6 つのコントローラーを持っていますが、すべての人が 6 つのアクションすべてを定義しているわけではありません。未定義のすべてのアクションを root_url にルーティングして、見苦しいエラー メッセージが表示されないようにしたいと考えていますが、それを行う方法がわかりません。誰でも私を助けることができますか?
2 に答える
コメントで他の人が指摘しているように、おそらく実際にはあなたが求めていることをしたくないでしょうが、あなたが求めているので、あなたが探している解決策はApplicationController
.
unless Rails.application.config.consider_all_requests_local
rescue_from AbstractController::ActionNotFound, with: :handle_error
rescue_from ActiveRecord::RecordNotFound, with: :handle_error
rescue_from ActionController::RoutingError, with: :handle_error
rescue_from ActionController::UnknownController, with: :handle_error
rescue_from ActionController::UnknownAction, with: :handle_error
end
protected
def handle_error
redirect_to root_url
end
これは基本的に、欠落しているルート、コントローラー、およびアクションに関するすべてのエラーをキャッチし、root_url にリダイレクトします。他のすべてのコントローラーが派生する ApplicationController にあるため、不足しているすべてのものに対して機能します。
私はそれらのレスキューをラップしたため、実際の問題に対処できるように、必要なローカル dev にエラーが引き続き表示されることに注意してください。
繰り返しになりますが、404、500 などのさまざまなエラー タイプの周りにいくつかのカスタム ページを配置してから、ユーザーをリダイレクトするか、ユーザー自身でナビゲートできるようにする方がよいでしょう。
Rails 3.2 以降では、これらのエラーを特定のラック エンド ポイント (アプリ自体を含む) に送信して、必要に応じて処理することもできます。これは上記のソリューションよりもはるかに優れていますが、Rails 3.2 以降でのみ機能します。古いバージョンでは、上記の解決策が機能します。
これを行うには、この行を application.rb に追加します。
config.exceptions_app = self.routes
次に、ルート ファイルで次のようなことができます。
match '/404', to: "error_pages#handle_404"
これは、handle_404 アクションを備えた ErrorPages コントローラーを持っていることを期待していますが、root_url を含め、それが何であれ、どこにでもルーティングすることもできます。すべてのエラー コードに対してこれを行うことができます。
各コントローラーの未定義のアクションで、次のように記述します。
redirect_to root_url