我的网站允许用户自由浏览到需要登录以继续使用服务的地步(键入"注册"按钮并完成注册过程(。
用户注册后,我想将他们重定向到最后一个有趣的页面,他们正在浏览:这可能是单击"注册"按钮之前的页面,或者更复杂的内容。例如,假设用户浏览一个"核心"内容页面,然后转到" about_us"页面,然后尝试注册,我宁愿将这些用户重定向到"核心"内容页面。
我想知道最好的方法是什么
- 表格中隐藏的参数?听起来很烦人,可以一直跟踪此参数(并在出现错误等时将其保留( 。
- 基于会话的信息(某种"智能引用" URL(
- 页面访问(例如,使用ahoy.js(
以及最后一个相关页面的"跟踪"?在控制器中?在视图中为JS代码?
有什么技巧可以这样做?
通过隐藏的表单字段和会话都有好处。使用控制器中的会话是最简单的,您可以在开发方面进行跟踪,但是如果用户有多个选项卡打开,则如果它们在选项卡之间跳跃,则可能会导致奇数页面流。在这里,隐藏表格字段效果更好,但维护更令人讨厌。我倾向于使用会话方法,并在控制器操作中执行类似以下操作:
#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