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

时间:2019-08-19 17:53:53

标签: ruby-on-rails ruby

嗨!我正在使用的系统具有以下功能:断开连接后,下次登录时,您将被重定向到您访问的最后一页。

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

问题在于,有时该路由不再存在。

想象一下,您的最后一页是'activity / 1',并且该活动被删除了,当您登录时,会看到一个错误屏幕。与此相关的主要问题是,一些用户感到困惑,为什么他们在进入“正常”路由(却被重定向到无效的路由)时会跳入错误。

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

我已经尝试过此操作:Check if URL exists in Ruby,但是系统是受登录保护的,因此请求未经许可即返回。

我可以通过任何实用的方法来验证自己的路线吗?

3 个答案:

答案 0 :(得分:0)

怎么样

1)在表中添加一个额外的字段status      并为要删除的页面设置为“假”。

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

答案 1 :(得分:0)

如果仅当用户通过SessionsController重新登录时才需要这样做,这是我的建议:

您可以创建某种before_action,例如ensure_first_place_after_login_existsSessionsController中的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的活动已从数据库中删除。