2010-02-26 7 views
16

J'essaie de sauvegarder le site d'où un utilisateur est venu lors de son inscription. En ce moment j'ai un before_filter dans mon ApplicationController:Comment enregistrer le référenceur http dans les rails

before_filter :save_referer 

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

Ensuite, lors de la création d'un utilisateur, il vérifie cette variable de session et qu'elle fixe à zéro. Parfois, cela ne fonctionne pas et je crains qu'il pourrait y avoir des choses inattendues avec l'utilisation de la session comme ça. Est-ce que quelqu'un a un meilleur moyen? Ou une entrée peut-être?

EDIT: Ceci est la logique que je utilise pour enregistrer le referer:

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

utilisateur

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

Y at-il des raisons pour lesquelles cela ne devrait pas travailler?

+1

"parfois, cela ne fonctionne pas" <- que fait-il? C'est normal si vous n'avez pas toujours de référent. Si l'utilisateur entre directement votre URL, il n'y a pas de référant. –

+0

Était-ce dans Rails 3 par hasard? – marcamillion

+0

Aussi, cela vous dérangerait-il de poster le code que vous avez travaillé? Comme dans, avez-vous éliminé tout ce qui précède - y compris les choses dans l'action 'create' et juste le remplacer par le code dans la réponse acceptée dans votre contrôleur d'application? Utilisez-vous toujours la méthode 'save_with (referer)' par exemple? J'essaie de faire la même chose, alors j'aimerais savoir comment vous avez pu résoudre cela, si vous l'avez fait. Merci. – marcamillion

Répondre

21

Je pense qu'il y a une faille dans votre approche. Tant que l'utilisateur clique sur des pages et n'est pas connecté, le code du filtre sera exécuté. Donc la seule façon session['referer'] sera pas être nul si elles vont directement à la page d'inscription où elles (probablement) afficher leurs informations de connexion et vous vérifiez la var session.

Je pense que vous devrez probablement vérifier le referer une seule fois - pour ce faire, vous devrez modifier votre code de filtre.

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

Maintenant, quand vous voulez savoir ce que leur referer est, il sera soit une URL valide ou « none ». Notez que puisque c'est dans la session, ce n'est pas parfait: ils peuvent aller à une autre URL et revenir et la session sera toujours valide.

+0

Droit, merci pour l'aide. J'ai considéré le problème de session périmé et je ne suis pas sûr de savoir quoi faire à ce sujet. Il semble que ce serait quelque chose que d'autres auraient abordé, mais je ne vois pas de blogs ou d'autres informations en ligne à ce sujet. – TenJack

+0

Comment récupère-t-il alors le referer pour une utilisation ailleurs? Est-ce qu'il doit enregistrer 'session ['referer']' dans son modèle 'User' dans la base de données, puis le récupérer comme' User.referer' quand il le veut? – marcamillion

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

belle ;-)

+0

bien. ne devrait pas être à moins is_logged_in?mais pas! is_logged_in? Je veux seulement enregistrer le référant s'il n'est pas connecté. – TenJack

0

Jonathan: s réponse fonctionne lors de l'utilisation des sessions. Dans le cas où vous ne voulez pas de meilleures informations, vous devriez également utiliser des cookies. L'utilisateur peut visiter votre site à partir d'un lien (avec un référent) puis s'en aller pour une journée et revenir directement sur votre site à nouveau (maintenant sans un referer). Ce serait mieux d'enregistrer des informations aussi un cookie dans le style suivant

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

Il y a aussi un petit bijou https://github.com/holli/referer_tracking pour aider à gérer ces derniers et d'autres traques automatiquement.