嗨!我正在使用的系统具有以下功能:断开连接后,下次登录时,您将被重定向到您访问的最后一页。
该信息以字符串first_place_after_login
的形式存储在数据库中,Rails会将用户带到那里。
问题在于,有时该路由不再存在。
想象一下,您的最后一页是'activity / 1',并且该活动被删除了,当您登录时,会看到一个错误屏幕。与此相关的主要问题是,一些用户感到困惑,为什么他们在进入“正常”路由(却被重定向到无效的路由)时会跳入错误。
因此,在重定向我的用户之前,我需要确保该路由仍然存在,并且为此创建特定的数据库检查将是非常糟糕的(因为可能不存在许多可能的路由)。因此,我想要一种将请求发送到我自己的路线并检查其返回状态的方法。
我已经尝试过此操作:Check if URL exists in Ruby,但是系统是受登录保护的,因此请求未经许可即返回。
我可以通过任何实用的方法来验证自己的路线吗?
答案 0 :(得分:0)
怎么样
1)在表中添加一个额外的字段status
并为要删除的页面设置为“假”。
2)仅重定向到具有有效status
的页面的URL,或将其重定向到后备URL。
答案 1 :(得分:0)
如果仅当用户通过SessionsController
重新登录时才需要这样做,这是我的建议:
您可以创建某种before_action
,例如ensure_first_place_after_login_exists
和SessionsController
中的rescue
发生了特定错误,并重定向到了root_path
或任何其他地方。
答案 2 :(得分:0)
您可以使用与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
这样有效的情况,但ID 1
的活动已从数据库中删除。