Как сохранить http referer в рельсах - PullRequest
16 голосов
/ 26 февраля 2010

Я пытаюсь сохранить сайт, с которого пришел пользователь при регистрации. Прямо сейчас в моем 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

Есть ли причина, по которой это не должно работать?

Ответы [ 3 ]

21 голосов
/ 27 февраля 2010

Я думаю, что в вашем подходе есть недостаток. Пока пользователь просматривает страницы и не вошел в систему, будет работать код фильтра. Таким образом, единственный способ session['referer'] будет , а не быть нулевым, - это если они сразу перейдут на страницу регистрации, где они (предположительно) публикуют свои данные для входа, и вы проверите сеанс var.

Я думаю, что вам, вероятно, нужно проверять реферер только один раз - для этого вам придется изменить код фильтра.

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

Теперь, когда вы захотите узнать, каков их реферер, это будет либо действительный URL, либо 'none'. Обратите внимание, что, поскольку он находится в сеансе, он не идеален: они могут перейти на другой URL и вернуться, и сеанс все еще будет действительным.

2 голосов
/ 09 марта 2010
def save_referer
  session['referer'] = request.env["HTTP_REFERER"] || 'none' unless session['referer'] && !is_logged_in?
end

красиво; -)

0 голосов
/ 25 апреля 2015

Ответ Джонатана работает при использовании сессий. Если вам не нужна более качественная информация, вы также должны использовать куки. Пользователь может зайти на ваш сайт по ссылке (с реферером), затем уйти на день и снова вернуться прямо на ваш сайт (теперь без реферера). Было бы лучше сохранить информацию также в cookie в следующем стиле

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

Существует также камень https://github.com/holli/referer_tracking, который помогает автоматически обрабатывать эти и другие отслеживания.

...