2010-02-26 21 views
16

Estoy intentando guardar el sitio del que proviene un usuario cuando se registra. Ahora mismo tengo un before_filter en mi ApplicationController:Cómo guardar http referer en rieles

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 lo pone a cero. A veces esto no funciona y me preocupa que haya algunas cosas no intencionadas que suceden con el uso de sesiones como esta. ¿Alguien tiene una mejor manera? O alguna entrada tal vez?

EDIT: Esta es la lógica que uso para guardar el árbitro:

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?

+1

"a veces, esto no funciona" <- ¿qué hace? Es normal que no siempre tenga un referer. Si el usuario ingresa su URL directamente, no hay referencia. –

+0

¿Fue esto en Rails 3 por casualidad? – marcamillion

+0

Además, ¿te importaría publicar el código que tienes trabajando? Como en, ¿eliminaste todo lo anterior, incluidas las cosas en la acción 'crear' y simplemente lo reemplazaste todo con el código en la respuesta aceptada en el controlador de la aplicación? ¿Todavía utiliza el método 'save_with (referer)' por ejemplo? Estoy tratando de hacer lo mismo, por lo que me encantaría saber cómo fue capaz de resolver esto, si es así. Gracias. – marcamillion

Respuesta

21

Creo que hay un error en su enfoque. Siempre que el usuario acceda a las páginas y no inicie sesión, se ejecutará el código de filtro. Entonces, la única forma en que session['referer'] será no sea nulo 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 necesites consultar el referer una vez; para ello, tendrás que modificar el código de tu filtro.

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

Ahora, cuando usted quiere saber cuál es su árbitro es, que será o bien 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.

+0

Derecha, gracias por la ayuda. Consideré el problema de la sesión obsoleta y no estoy seguro de qué hacer al respecto. Parece que esto sería algo que otros habrían abordado, pero no veo ningún blog u otra información en línea al respecto. – TenJack

+0

¿Cómo recupera el referer para su uso en otro lugar? ¿Tiene que guardar 'session ['referer']' a su modelo 'User' en el db, y luego recuperarlo como' User.referer' cuando lo quiera? – marcamillion

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

hermosa ;-)

+0

agradable. ¿No debería ser eso a menos que esté_logged_in?sin embargo, y no! is_logged_in? Solo quiero guardar el referrer si no están conectados. – TenJack

0

Jonathan: s respuesta funciona cuando se utiliza sesiones. En caso de que desees una mejor información, también deberías usar cookies. El usuario puede visitar su sitio desde un enlace (con un referenciador) y luego irse por un día y regresar directamente a su sitio nuevamente (ahora sin un referidor). Sería mejor guardar información también a una cookie en el siguiente estilo

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

Hay también una joya https://github.com/holli/referer_tracking para ayudar a manejar estos y otros rastreos de forma automática.

Cuestiones relacionadas