2009-03-26 5 views

답변

8

실제로 세션에서 값을 삭제하는 방법이 있습니다. RichH와 마찬가지로 세션 변수는 CGI :: Session 인스턴스입니다. session[:foo]과 같이 입력하면 실제로 세션 객체의 @data 인스턴스 변수에서 해당 심볼을 찾습니다. 해당 데이터 변수는 해시입니다.

EDIT : CGI :: Session 클래스에 데이터 인스턴스 변수가 있습니다. docs으로 이동하여 []= 메소드의 소스 코드를 보면 @data 회원이 있다는 것을 알 수 있습니다.

그래서 session[:foo]을 삭제 당신이해야 할 모든 액세스 세션 내부에서 @data 변수가

이제
session.data[:foo] 

을 삭제하는 것입니다 :

session.data.delete :foo 

당신은 이것을이 있어야 어떤을하지 않는다되면 세션 변수에 더 많은 foo가 있습니다.

+0

세션 저장의 모든 휴대용 건너인가? 문서에서 데이터 속성이 언급되지 않았기 때문에 조금 친숙 해 보입니다. – RichH

+0

솔직히 모르겠습니다. 나는 그것을 디버거를 사용하고 세션 변수를 검사하여 발견했다. 그래도 내 답변에 대한 약간의 지원을 찾을 수있었습니다 http://tinyurl.com/cp7ntm, 그들은 session_data = @ _session.data를 할당 마지막 방법을 확인하십시오. 그게 내가 찾을 수있는 가장이야 – vrish88

+0

방금 ​​주제에 대한 몇 가지 문서에 대한 더 나은 소스로 내 대답을 업데이 트했습니다. – vrish88

2

세션이 Ruby CGI::Session이고 해시가 아니기 때문에 세션 삭제는 실제로 세션을 삭제합니다. 삭제는 매개 변수를 필요로하지 않습니다 - 이것은 당신이 hyuan이 제안한 것을 시도 할 때 "잘못된 인수 (1 또는 0)"메시지를받는 것입니다.

세션 입력을 지우려면 일반적으로 받아 들여지는대로 세션 [: foo] = nil을 사용하는 것이 좋습니다. 그것은 이상적이지는 않지만 세션 [: foo] .nil 같은 문장? 예상 한대로 동작합니다.

나는 정상적인 해시처럼 행동하고 싶다. 그러나 그렇지 않다.

72

가장 간단한 버전은처럼 보입니다. 모든 상점 (쿠키, 파일, ActiveRecord, ...)은 AbstractStore::SessionHash을 데이터가 들어있는 오브젝트로 사용하며, 다른 상점은 AbstractStore::SessionHash 인스턴스를로드하고 저장하는 수단 만 제공합니다. Hash에서

AbstractStore::SessionHash 상속 그래서 이것은 Hash#delete 방법 연기 :

session.delete(:key_to_delete) 
+0

그들은 행동을 바꾼 것처럼 보입니다. 레일즈 2.3에서는 기억이 안납니다. 감사! – iGEL

+3

허용되는 답변이어야합니다. – maprihoda