Я пытаюсь сохранить сайт, что пользователь произошел из того, когда они подписываются. Прямо сейчас у меня есть before_filter в моем ApplicationController:
before_filter :save_referer
def save_referer
unless is_logged_in?
session['referer'] = request.env["HTTP_REFERER"] unless session['referer']
end
end
Затем, когда пользователь создается, это проверяет эту переменную сеанса и устанавливает его на ноль. Иногда это не работает, и я волнуюсь, что могли бы быть некоторые непреднамеренные вещи, происходящие с использованием сессии как это. У кого-либо есть лучший путь? Или некоторый вход, возможно?
Править: Это - логика, которую я использую для сохранения ссылающегося домена:
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
Есть ли какая-либо причина, почему это не должно работать?
Я думаю, что в вашем подходе есть изъян. Пока пользователь посещает страницы и не вошел в систему, код фильтра будет выполняться. Таким образом, единственный способ 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
красиво; -)