如何在重定向之前验证自己的路由?



Hay!我正在开发的系统具有以下功能:断开连接后,下次登录时,您将被重定向到上次访问过的页面。

该信息以名为first_place_after_login的字符串的形式存储在数据库中,Rails 会将用户带到那里。

问题是有时这条路线不再存在。

假设您的最后一个页面是"活动/1",并且该活动被删除,当您登录时,您将看到一个错误屏幕。这样做的主要问题是,一些用户会感到困惑,为什么当他们刚刚输入"正常"路线(但被重定向到无效路线(时,他们会直接跳入错误。

因此,在重定向我的用户之前,我需要确保该路由仍然存在,并且为此创建特定的数据库检查将非常糟糕(因为有数十种可能的路由不存在(。所以我想要一种方法来向我自己的路由发送请求,并检查它返回我的状态。

我试过这个:检查 Ruby 中是否存在 URL,但系统是登录安全的,因此请求返回为未经许可。

有什么实用的方法可以验证我自己的路线吗?

您可以使用 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

请记住,它不包括 URL 本身像/activities/1一样有效的情况,但 ID1的活动已从数据库中删除。

怎么样

1( 在表格中添加一个额外的字段status并为被删除的页面设置为"false"。

2( 仅重定向到具有活动status的页面的 URL,或将其重定向到后备 URL。

如果您只需要在用户通过SessionsController重新登录的情况下才能做到这一点,这是我的建议:

您可以创建某种before_action例如ensure_first_place_after_login_exists在您的SessionsController中,并通过重定向到root_path或任何其他位置来rescue特定错误。

最新更新