0

具体来说,我目前正在开发一个需要这种行为的 Ruby on Rails 应用程序,但在意识到许多关于 SO 的现有问题都涉及特定语言或框架之后,我故意以与语言和框架无关的方式来措辞我的标题。我希望有一些关于如何在任何语言/框架中解决/实施的一般性建议/指南。

背景:

正在开发的应用程序是一个带有登录页面的 Ruby on Rails 应用程序。登录后,某条路线通向一个页面,底部显示一个(某种反馈)表单。这个表单部分可以使用 URL 片段来聚焦(我希望有一个锚点)。

如果用户已经登录,则按照已附加片段的路由的 URL 指向以表单部分为焦点的页面。

但是,我需要一个解决方案,其中一个精心制作的 URL 会导致该部分,而不管用户最初是否登录。如果用户尚未登录,则应显示登录页面,成功登录后,应关注表单部分。

此外,该 URL 将包含在电子邮件中。

但是,该片段在重定向时会丢失,因为它似乎不是由浏览器发送到服务器的,并且重定向是使用以下命令在服务器端执行的:

def after_sign_in_path_for(resource)
  params[:redirect_path].presence || stored_location_for(resource)
end

对于这种可以用任何语言或框架实现的场景,是否有一个好的、简单、干净的解决方案?

虽然我目前确实有一种解决方案,但我对它并不完全满意,因为它看起来有点像黑客。我将在下面将其作为答案发布,希望其他人可以提出更好的解决方案。

4

1 回答 1

0

请注意:这有点像黑客,我不是很喜欢。

本质上,我所做的是将片段两次附加到 URL,一次使用#urlencoded 并作为查询字符串的一部分,一次未编码。这是为了支持用户尚未登录和已登录的两种情况。

在服务器端,在重定向到登录页面之前,我们会捕获当前 URL,然后使用它来重定向回来。但是,自然地,捕获的 URL 不包含未编码的片段,浏览器将保留这些片段,但是,将存在 urlencoded 片段。这可以在保存之前(立即捕获)或在稍后使用之前,在重定向之前解码。本质上,您要做的是将最后一次出现%23的 URL 编码#替换为 unencoded #,然后将其用于重定向目的。您可以使用正则表达式替换来执行此操作。例如,我在 Ruby 中替换/.*\K%23/'#'(见下文)。

例子:

https://example.com/resource/00000000-0000-0000-0000-000000000000?%23feedback-form#feedback-form

Ruby on Rails:

def after_sign_in_path_for(resource)
  (params[:redirect_path].presence || stored_location_for(resource))&.sub(/.*\K%23/, '#')
end

希望这对某人有所帮助,但我仍然希望有更好的方法来做到这一点。

于 2021-05-16T19:32:25.087 回答