2010-02-26 22 views
16

Sto provando a salvare il sito di provenienza di un utente al momento della registrazione. In questo momento ho un before_filter nel mio ApplicationController:Come salvare il referer http nelle guide

before_filter :save_referer 

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

Poi, quando si crea un utente, controlla questa variabile di sessione e lo imposta a zero. A volte questo non funziona e sono preoccupato che potrebbero esserci delle cose non intenzionali che accadono nell'usare una sessione come questa. Qualcuno ha un modo migliore? O forse qualche input?

EDIT: ci

def create  
    @user = User.new(params[:user]) 
    if @user.save_with(session[:referer]) 
    .... 
end 

utente

def save_with(referer) 
    self.referer = referer unless referer == "null" 
    self.save 
end 

è alcuna ragione per cui questo non dovrebbe funzionare: Questa è la logica che sto usando per salvare il referer?

+1

"a volte, questo non funziona" <- cosa fa? È normale che non si abbia sempre un referente. Se l'utente inserisce il tuo url direttamente, non c'è un referente. –

+0

Questo era in Rails 3 per caso? – marcamillion

+0

Inoltre, ti dispiacerebbe postare il codice che hai funzionato? In questo modo, hai eliminato tutto quanto sopra, incluse le cose nell'azione 'create' e semplicemente lo sostituisci con il codice nella risposta accettata nel controller dell'applicazione? Usi ancora il metodo 'save_with (referer)' per esempio? Sto cercando di fare la stessa cosa, quindi mi piacerebbe sapere come sei riuscito a risolvere questo, se l'hai fatto. Grazie. – marcamillion

risposta

21

Penso che ci sia un difetto nel tuo approccio. Finché l'utente sta premendo le pagine e non ha effettuato l'accesso, verrà eseguito il codice del filtro. Quindi l'unico modo session['referer'] sarà non essere nil se vanno direttamente alla pagina di registrazione dove (presumibilmente) pubblicano le loro informazioni di accesso e si controlla la sessione var.

Penso che probabilmente dovrai controllare il referer una volta sola: per farlo dovrai modificare il codice del filtro.

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

Ora, quando si vuole sapere quale sia il loro referer è, o sarà un URL valido o 'none'. Nota che dal momento che è nella sessione, non è perfetto: potrebbero andare a un altro URL e tornare e la sessione sarà ancora valida.

+0

Giusto, grazie per l'aiuto. Ho considerato il problema della sessione obsoleta e non sono sicuro di cosa fare al riguardo. Sembra che questo sarebbe qualcosa che altri avrebbero affrontato ma non vedo blog o altre informazioni online su di esso. – TenJack

+0

Come può quindi recuperare il riferimento da utilizzare altrove? Deve salvare 'session ['referer']' nel suo modello 'User' nel db, quindi recuperarlo come' User.referer' quando lo vuole? – marcamillion

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

bella ;-)

+0

bello. non dovrebbe essere quello a meno che is_logged_in?comunque e non! is_logged_in? Voglio solo salvare il referrer se non sono loggati. – TenJack

0

Jonathan: s risposta funziona quando si utilizza le sessioni. Nel caso in cui non disponiate di informazioni migliori dovreste usare anche i cookies. L'utente può visitare il tuo sito da un link (con un referente), quindi andare via per un giorno e tornare direttamente al tuo sito di nuovo (ora senza un riferimento). Sarebbe meglio salvare le informazioni anche a un cookie nel seguire stile

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

V'è anche un gioiello https://github.com/holli/referer_tracking per contribuire a gestire queste ed altre rilevazioni automaticamente.

Problemi correlati