2010-02-26 2 views
16

가입시 사용자가 방문한 사이트를 저장하려고합니다. 지금은 내와 ApplicationController에 before_filter이 : 사용자가 생성 될 때 레일에 http 리퍼러를 저장하는 방법

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 

문제가 해결되지해야하는 이유 모든 이유가있다 :이 내가 리퍼러를 저장하기 위해 사용하고있는 논리는?

+1

"가끔은 작동하지 않습니다."<- 그것은 무엇을합니까? 항상 평론가가없는 경우 정상입니다. 사용자가 직접 URL을 입력하면 리퍼러가 없습니다. –

+0

우연히 레일 3에 있었나요? – marcamillion

+0

또한 작업중인 코드를 게시 하시겠습니까? 마찬가지로, 위의 모든 것을 제거 했습니까 - 'create'액션의 내용을 포함하여 응용 프로그램 컨트롤러에서 허용되는 답변의 코드로 대체하십시오. 예를 들어 여전히'save_with (referer)'메소드를 사용합니까? 나는 똑같은 일을하려하고 있습니다. 그렇게했다면 어떻게 해결할 수 있었는지 알고 싶습니다. 감사. – marcamillion

답변

21

나는 당신의 접근법에 결함이 있다고 생각합니다. 사용자가 페이지를 때리고 로그인하지 않으면 필터 코드가 실행됩니다. 따라서 유일한 방법은 session['referer']이 아니고이 아닐 수 있습니다. 가입 페이지로 바로 이동하면 (아마도) 로그인 정보를 게시하고 세션을 확인할 수 있습니다. var.

아마도 리퍼러를 한 번만 확인하면됩니다. 이렇게하려면 필터 코드를 수정해야합니다.

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

지금 당신이 그들의 리퍼러가 무엇인지 알고 싶을 때, 그것은 유효한 URL 또는 '없음'으로 할 수있다. 세션에 있기 때문에 완벽하지는 않습니다. 다른 URL로 이동하여 다시 돌아올 수 있으며 세션은 계속 유효합니다. ;-)

+0

바로 도움을 주셔서 감사합니다. 나는 부실 세션 문제를 생각하고 그것에 대해 무엇을해야할지 모르겠습니다. 이것은 다른 사람들이 해결해야 할 것이지만 내 블로그 나 온라인 정보를 온라인에서 볼 수없는 것 같습니다. – TenJack

+0

그는 어떻게 다른 곳에 사용하기 위해 referer를 검색합니까? DB의'User' 모델에'session [ 'referer']'를 저장하고, 그것을 원할 때'User.referer'처럼 검색해야합니까? – marcamillion

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

아름다운

+0

nice. is_logged_in이 아니면 않는가?그래도 아니야! is_logged_in? 리퍼러가 로그인하지 않은 경우에만 리퍼러를 저장하려고합니다. – TenJack

0

조나단 : 세션을 사용할 때의 대답은 작동합니다. 더 나은 정보를 원하지 않는 경우 쿠키를 사용해야합니다. 사용자는 링크 (리퍼러가 있음)에서 사이트를 방문한 다음 하루 동안 떠나서 다시 리퍼러없이 사이트로 바로 돌아갈 수 있습니다. 스타일

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

다음에 쿠키로도 정보를 저장하는 것이 더 있을까 자동으로 이들과 다른 trackings을 처리하는 데 도움이되는 보석 https://github.com/holli/referer_tracking 있습니다.

관련 문제