如何在rails中保存http referer

我正在尝试保存用户注册时来自的网站。 现在我的ApplicationController中有一个before_filter:

before_filter :save_referer def save_referer unless is_logged_in? session['referer'] = request.env["HTTP_REFERER"] unless session['referer'] end end 

然后,当创建用户时,它会检查此会话变量并将其设置为nil。 有时这不起作用,我担心使用这样的会话可能会发生一些意想不到的事情。 有没有人有更好的方法? 还是一些输入?

编辑:这是我用来保存引用者的逻辑:

 def create @user = User.new(params[:user]) if @user.save_with(session[:referer]) .... end 

用户

 def save_with(referer) self.referer = referer unless referer == "null" self.save end 

有什么理由不适用吗?

我认为你的方法存在缺陷。 只要用户正在点击页面并且未登录,filter代码就会运行。 因此, session['referer'] 不会是nil的唯一方法是,如果他们直接进入注册页面,他们(可能)发布他们的登录信息并检查会话变量。

我想你可能只需要检查一次referer – 要做到这一点你必须修改你的filter代码。

 def save_referer unless is_logged_in? unless session['referer'] session['referer'] = request.env["HTTP_REFERER"] || 'none' end end end 

现在,当你想知道他们的引用者是什么时,它将是一个有效的url或“无”。 请注意,由于它在会话中,它并不完美:它们可以转到另一个URL并返回,会话仍然有效。

 def save_referer session['referer'] = request.env["HTTP_REFERER"] || 'none' unless session['referer'] && !is_logged_in? end 

美丽;-)

乔纳森:在使用会话时,答案是有效的。 如果你没有更好的信息,你也应该使用cookies。 用户可以通过链接(与引用者)访问您的站点,然后离开一天并再次直接返回您的站点(现在没有引用者)。 最好将信息保存到以下风格的cookie中

 def save_referer if cookies[:referer].blank? cookies.permanent[:referer] = request.env["HTTP_REFERER"] || 'none' end end 

还有一个gemhttps://github.com/holli/referer_tracking来帮助自动处理这些和其他跟踪。