注册后基于导航的重定向

我的网站允许用户自由浏览到需要登录的位置以继续使用该服务(点击“注册”按钮并完成注册过程)。

一旦用户注册,我想将它们重定向到他们正在浏览的最后一个有趣页面:它可能是点击注册按钮之前的页面,或更复杂的页面。 例如,假设用户浏览“核心”内容页面,然后转到“about_us”页面,然后尝试注册,我宁愿将这些用户重定向到“核心”内容页面。

我想知道最好的方法是什么

  • 表格中隐藏的参数? 在整个表单中跟踪此参数听起来很烦人(并在出现错误时保留它等)
  • 基于会话的信息(某种“智能推荐人”url)
  • 页面访问(例如,使用Ahoy.js)

在哪里/何时对最后一个相关页面进行“跟踪”? 在控制器? 在视图中作为JS代码?

做这样的事情的任何提示?

通过隐藏的表单字段和会话都有好处。 在开发过程中,使用控制器中的会话是最简单的跟踪,但是如果用户打开了多个选项卡,如果它们在选项卡之间跳转,则可能导致奇怪的页面流。 这是隐藏的表单字段运行得更好但维护起来更烦人的地方。 我倾向于使用sessions方法并在控制器操作中执行以下操作:

#This will store the page they're coming from to get to this action. session[:interesting_page] = request.env["HTTP_REFERER"] || root_path #Or store the current interesting page within the interesting page's controller action session[:interesting_page] = request.original_url 

一种方法是使用HTTP_REFERER重定向登录HTTP_REFERER当然是有限的,因为一些客户端不发送它。 但你也可以争辩说,如果客户端没有发送标题,他们就不希望被跟踪。

另一种解决方案是使用会话:

 class ApplicationController after_action :set_referrer, unless: :user_signed_in? def set_referrer session[:referrer] = if request.post? request.fullpath + '/new' elsif request.patch? || request.put? request.fullpath + '/edit' else request.fullpath end end end class SessionController def create @user = User.find_by(params[:email]) .try(:authenticate, params[:password]) if @user render :new else redirect_to session[:referrer] || root_path end end end