Pergunta

Em ruby ??on rails ao fazer session[:foo] = nil deixa uma entrada chamada :foo no objeto sessão. Como você pode se livrar desse única entrada do objeto de sessão?

Foi útil?

Solução

Na verdade, há uma maneira de obter o valor de uma exclusão da sessão. Como RichH disse que a variável de sessão é uma instância CGI :: Session. Ao digitar algo como session[:foo] é realmente olhando esse símbolo em uma variável de instância @data no objeto sessão. Essa variável de dados é um hash.

EDIT: Há uma variável de instância de dados no CGI :: class Session. Se você ir para a docs olhar para o código-fonte para o método []= você verá que há um membro @data.

Assim, para session[:foo] apagar tudo que você tem a fazer é o acesso a variável @data de dentro da sessão

   session.data[:foo]

Agora, para excluí-lo:

   session.data.delete :foo

Depois de fazer isso a não deveria haver mais foo na variável de sessão.

Outras dicas

Parece que os simples Works versão . Todas as lojas (Cookie, Arquivo, ActiveRecord, ...) uso AbstractStore::SessionHash como o objeto que contém os dados, as diferentes lojas oferecem apenas os meios para carregar e salvar as instâncias AbstractStore::SessionHash.

herda AbstractStore::SessionHash de Hash, assim que este remete para o método Hash#delete:

session.delete(:key_to_delete)

Como a sessão é um rubi CGI :: Session e não um Hash, chamando excluirá realmente sessão de exclusão. Excluir não tem parâmetros -. Este é o meu você está recebendo o "número errado de argumentos (1 ou 0)" mensagem quando você tenta o hyuan sugere

A forma geralmente aceite para limpar uma entrada de sessão é com sessão [: foo] = nil como você sugere. Está longe de ser ideal, mas declarações como session [: foo] .nil? irá se comportar conforme o esperado.

Eu realmente gostaria que ele se comportou como um Hash normais ... mas isso não acontece.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top