Как сохранить 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
Есть ли причина, почему это не должно работать?
Ответы
Ответ 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, чтобы автоматически обрабатывать эти и другие отслеживания.