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
特定错误。