Подтвердить что ты не робот

Как сохранить HTTP-референт в рельсах

Я пытаюсь сохранить сайт, с которого пришел пользователь, когда он регистрируется. Прямо сейчас у меня есть pre_filter в моем ApplicationController:

before_filter :save_referer

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

Затем, когда пользователь создается, он проверяет эту переменную сеанса и устанавливает ее в nil. Иногда это не работает, и я беспокоюсь, что могут случиться какие-то непреднамеренные действия, связанные с использованием сеанса. Кто-нибудь имеет лучший способ? Или какой-нибудь ввод возможно?

EDIT: это логика, которую я использую для сохранения референта:

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

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

4b9b3361

Ответ 1

Я думаю, что есть недостаток в вашем подходе. Пока пользователь нажимает на страницы и не входит в систему, будет запущен код фильтра. Таким образом, единственный способ 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

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

красивый; -)

Ответ 3

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

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

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