Ruby on rails 如何在rails中保存http引用器

Ruby on rails 如何在rails中保存http引用器,ruby-on-rails,session,http-referer,Ruby On Rails,Session,Http Referer,我正试图保存用户注册时的网站。现在,我的ApplicationController中有一个before_过滤器: before_filter :save_referer def save_referer unless is_logged_in? session['referer'] = request.env["HTTP_REFERER"] unless session['referer'] end end 然后,当创建用户时,它会检查此会话变量并将其设置

我正试图保存用户注册时的网站。现在,我的ApplicationController中有一个before_过滤器:

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
使用者


这有什么理由不起作用吗

我认为你的方法有缺陷。只要用户点击页面且未登录,过滤代码就会运行。因此,
session['referer']
唯一不会为零的方法是,他们直接进入注册页面,在那里(大概)发布他们的登录信息,然后你检查session变量

我认为您可能只需要检查referer一次——要做到这一点,您必须修改您的筛选代码

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

美丽;-)

Jonathan:s的答案在使用会话时有效。如果你不想得到更好的信息,你也应该使用cookies。用户可以通过链接访问您的站点(有推荐人),然后离开一天,再次直接返回您的站点(现在没有推荐人)。最好将信息也保存到以下样式的cookie中

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

还有一个gem可以帮助自动处理这些和其他跟踪。

“有时,这不起作用”这是Rails 3中偶然出现的吗?另外,您介意发布您正在工作的代码吗?与中一样,您是否删除了上述所有内容—包括
create
操作中的内容,并将其全部替换为应用程序控制器中接受答案中的代码?例如,您是否仍然使用
save_with(referer)
方法?我正在尝试做同样的事情,所以我很想知道你是如何解决这个问题的,如果你做到了的话。谢谢。好的,谢谢你的帮助。我考虑了陈旧的会话问题,不知道该怎么办。这似乎是其他人应该解决的问题,但我在网上没有看到任何关于它的博客或其他信息。然后他如何检索引用以供其他地方使用?他是否必须将
会话['referer']
保存到数据库中的
用户
模型中,然后像
User.referer那样在需要时检索它?很好。除非您登录,否则不应该这样做吗?虽然不是!您是否已登录?我只想保存未登录的推荐人。
def save_referer
  if cookies[:referer].blank?
    cookies.permanent[:referer] = request.env["HTTP_REFERER"] || 'none'
  end
end