リダイレクトする前に自分のルートを検証するにはどうすればよいですか?
概要
やあ!私が取り組んでいるシステムには次の機能があります。切断後、次回ログインすると、最後にアクセスしていたページにリダイレクトされます。
その情報は first_place_after_login という文字列として DB に保存され、Rails がユーザーをそこに連れて行きます。
問題は、そのルートが存在しないことがあるということです。
最後のページが「activity/1」で、そのアクティビティが削除されたと想像してください。ログインすると、エラー画面が表示されます。これに関する主な問題は、一部のユーザーが、「通常の」ルートに入ったばかりなのに(無効なルートにリダイレクトされた)、なぜすぐにエラーに陥るのか混乱していることです。
したがって、ユーザーをリダイレクトする前に、そのルートがまだ存在することを確認する必要があります。そのための特定の DB チェックを作成するのは非常に悪いことです (存在しない可能性のあるルートが数十あるため)。そこで、独自のルートにリクエストを送信し、返されるステータスを確認する方法が必要でした。
私はこれを試しました: URLがRubyに存在するかどうかを確認しますが、システムはログインで保護されているため、リクエストは許可なしとして返されます。
自分のルートを検証する実用的な方法はありますか?
解決策
Rails がルートからコントローラーとその他のパラメーターを決定するために使用するのと同じ方法を使用できます。
/activities/1 が存在すると想像してください。
Rails.application.routes.recognize_path('/activities/1', method: :get)
#=> {:controller=>"activites", :action=>"show", :id=>"1"}
そして、そのルートがもう存在しない場合は、次のようになります。
Rails.application.routes.recognize_path('/activities/1', method: :get)
#=> raises ActionController::RoutingError (No route matches "/activities/12")
これにより、次のようなヘルパー メソッドを構築できます。
def redirect_to_last_page(url_from_session)
Rails.application.routes.recognize_path(url_from_session, method: :get)
redirect_to(url_from_session)
rescue ActionController::RoutingError
redirect_to root_path
end
/activities/1 のように URL 自体は有効であるが、ID 1 のアクティビティがデータベースから削除された場合などはカバーされないことに注意してください。