Como você limpar uma única entrada de um ruby ??on rails sessão?
-
22-08-2019 - |
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?
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.