ruby on rails - Cómo guardar el referer http en los rieles
ruby-on-rails session (3)
Estoy intentando guardar el sitio del que proviene un usuario cuando se registran. Ahora mismo tengo un before_filter en mi ApplicationController:
before_filter :save_referer
def save_referer
unless is_logged_in?
session[''referer''] = request.env["HTTP_REFERER"] unless session[''referer'']
end
end
Luego, cuando se crea un usuario, comprueba esta variable de sesión y la establece en cero. A veces esto no funciona y me preocupa que puedan ocurrir algunas cosas inesperadas con el uso de una sesión como esta. ¿Alguien tiene una mejor manera? ¿O alguna entrada tal vez?
EDITAR: Esta es la lógica que estoy usando para guardar el referente:
def create
@user = User.new(params[:user])
if @user.save_with(session[:referer])
....
end
Usuario
def save_with(referer)
self.referer = referer unless referer == "null"
self.save
end
¿Hay alguna razón por la que esto no debería funcionar?
Creo que hay un defecto en su enfoque. Mientras el usuario esté golpeando las páginas y no haya iniciado sesión, se ejecutará el código del filtro. Por lo tanto, la única manera de que la session[''referer'']
no sea nula es si van directamente a la página de registro donde (presumiblemente) publican su información de inicio de sesión y usted verifica la var. De sesión.
Creo que probablemente solo necesite consultar el referente una vez, para ello tendrá que modificar el código del filtro.
def save_referer
unless is_logged_in?
unless session[''referer'']
session[''referer''] = request.env["HTTP_REFERER"] || ''none''
end
end
end
Ahora, cuando quiera saber cuál es su referente, será una URL válida o "ninguna". Tenga en cuenta que, dado que está en la sesión, no es perfecto: podrían ir a otra URL y volver, y la sesión seguirá siendo válida.
Jonathan: La respuesta de s funciona cuando se usan sesiones. En caso de que no disponga de mejor información, también debe utilizar cookies. El usuario puede visitar su sitio desde un enlace (con un referente) y luego irse por un día y volver directamente a su sitio (ahora sin un referente). Sería mejor guardar información también en una cookie en el siguiente estilo
def save_referer
if cookies[:referer].blank?
cookies.permanent[:referer] = request.env["HTTP_REFERER"] || ''none''
end
end
También hay una gema https://github.com/holli/referer_tracking para ayudar a manejar estos y otros seguimientos de forma automática.
def save_referer
session[''referer''] = request.env["HTTP_REFERER"] || ''none'' unless session[''referer''] && !is_logged_in?
end
hermoso ;-)