Techioz Blog

リダイレクトする前に自分のルートを検証するにはどうすればよいですか?

概要

やあ!私が取り組んでいるシステムには次の機能があります。切断後、次回ログインすると、最後にアクセスしていたページにリダイレクトされます。

その情報は 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 のアクティビティがデータベースから削除された場合などはカバーされないことに注意してください。