17

我正在尝试保存用户注册时来自的网站。现在我的 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

有什么理由不应该这样做吗?

4

3 回答 3

22

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

我认为您可能只需要检查一次引用者-为此,您必须修改过滤器代码。

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

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

于 2010-02-26T21:39:14.267 回答
2
def save_referer
  session['referer'] = request.env["HTTP_REFERER"] || 'none' unless session['referer'] && !is_logged_in?
end

美丽的 ;-)

于 2010-03-09T02:17:40.357 回答
0

乔纳森:s answer在使用会话时有效。如果您不想要更好的信息,您还应该使用 cookie。用户可以从一个链接(有推荐人)访问您的网站,然后离开一天并再次直接返回您的网站(现在没有推荐人)。最好将信息也保存到以下样式的cookie中

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

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

于 2015-04-25T13:17:21.143 回答