2011-02-11 3 views
0

여기 시나리오가 있습니다. 웹 서퍼 (방문자)는 웹 사이트의 구매 페이지에 있습니다. 이 페이지에서 방문자는 새로운 사용자 등록 세부 정보, 신용 카드 정보를 입력하고 구매를 완료 할 수 있으며 동시에 새 사용자를 만들거나 기존 계정으로 로그인 할 수 있습니다. 방문자가 기존 계정을 사용하여 로그인하려면 새 세션을 만든 후에 동일한 구매 페이지로 리디렉션되어야합니다. 세션 [: pchase_page_after_login] = true세션 [: path_purchase_page] = path_of_current_page의 두 세션 변수를 사용하여이 작업을 수행 할 수있었습니다. 로그인이 끝나면이 varialbes를 nil로 만듭니다.

사용자가 구매 페이지에서 로그인하면이 모든 작업이 잘됩니다. 그러나 사용자가 구매 페이지에서 다른 페이지로 이동하면이 두 세션 변수는 여전히 세션에 저장되며 0이 아닙니다. 따라서 다른 몇 페이지를 횡단 한 후 방문자가 로그인을 시도하면 세션 [: pchase_page_after_login] = true세션 [: path_purchase_page] =과 같은 구매 페이지로 리디렉션됩니다. 따라서 특정 세션 변수가 다음 요청 내에서만 사용 가능하게하는 방법이 있는지 알고 싶습니다. 의 콘텐츠를 알고 있습니다 : 플래시은 다음 요청시에만 사용할 수 있지만이 용도로 사용하는 것이 현명한 방법인지는 알 수 없습니다. 세션 변수가 더 적합하지만이 두 세션 변수를 다음 요청에만 사용할 수 있습니다. 이것을 달성 할 수있는 방법이 있습니까? 미리 감사드립니다.세션 변수를 다음 요청까지만 사용 가능하게 설정하십시오.

답변

2

내가 권장하는 것은 필터를 사용하기 전에 이것을 사용하는 것입니다. 예를 들어, 다음 작업을 수행 할 수 있습니다 :

class ApplicationController 
    before_filter :delete_session_purchase 

    protected 

    def delete_session_purchase 
    session.delete :path_purchase_page 
    session.delete :purchase_page_after_login 
    end 
end 

class SessionsController 
    skip_before_filter :delete_session_purchase, :only => [:new, :create] 
end 

이것은 당신이 구매 페이지로 사용자를 리디렉션 세션 변수를 제거 할 정규 요청 것을 의미하지만, 로그인 행동에 당신의 주위에 이러한 변수를 유지한다. 이렇게하면 정상적인 상황에서 세션 변수를 지우려는 경우를 제외하고는 세션 변수가 단순히 삭제됩니다.

+0

감사합니다. 코드가 매력처럼 작동합니다. 나는 그것의 대부분을 이해했다. 당신이 설명하기를 원할 것인가? skip_before_filter에서만, 그리고이 모든 것이 어떻게 작동 하는가? – rookieRailer

+0

그래, 유일한 부분은 세션 컨트롤러에서 새 작업 또는 생성 작업이 호출 될 때 before 필터 (delete_session_purchase 함수) 만 건너 뛰어야한다는 것입니다. 실제 before 필터가 실행되면 세션 [: path_purchase_page] 및 세션 [: purchase_page_after_login]이 삭제되어 정상적인 상황에서는 리디렉션이 발생하지 않습니다. –

+0

좋아요, 어떻게 작동하는지 이해합니다. 이 두 세션 변수의 삭제는 sessioncontroller의 new 및 create 액션에서 발생하지 않습니다. 그리고 세션 변수는 "로그인"요청을 몇 번 보내더라도 삭제되지 않은 채로 남아 있지만 사용자는 이미 로그인 페이지에 있으므로이 것은 중요하지 않습니다. 이것은 아름다운 논리입니다. 감사. – rookieRailer

1

이 경우 flash을 원하십니까? 그것은 세션에 저장되어 있지만 다음 요청 후에 자동으로 nill됩니다. 맞춤 솔루션은 플래시가 이미 수행 한 것을 효과적으로 복제하게됩니다.

로그인 후 redirect_to :back으로 로그인하면 로그인 한 페이지로 돌아갑니다.

관련 문제