Como esvaziar / destruir uma sessão em trilhos?

133

Não consigo encontrá-lo em nenhum lugar ... Como excluir / destruir / redefinir / esvaziar / limpar a sessão de um usuário no Rails? Não apenas um valor, mas a coisa toda ..

tybro0103
fonte

Respostas:

203

Para limpar tudo, use o método reset_session em um controlador.

reset_session

Aqui está a documentação sobre este método: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

Redefine a sessão limpando todos os objetos armazenados e inicializando um novo objeto de sessão.

Boa sorte!

Gdeglin
fonte
1
Para sessões baseadas em banco de dados (que você provavelmente deve usar) pode expirar através de uma consulta: guides.rubyonrails.org/security.html#session-expiry
m33lky
44

a sessão nos trilhos é um objeto hash. Portanto, qualquer função disponível para limpar o hash funcionará com as sessões.

session.clear

ou se chaves específicas tiverem que ser destruídas:

session.delete(key)

Testado nos trilhos 3.2

adicionado

As pessoas mencionaram por session={}é uma má ideia. A respeito session.clear, Lobati comenta - Parece que você provavelmente está melhor usando reset_session [do que session.clear], como ele faz algumas outras limpezas além do que o session.clear faz. Internamente, reset_session chama session.destroy , que por si só chama claro, além de outras coisas.

Lavixu
fonte
Alguém tem alguma opinião sobre os méritos deste método versus o recomendado por Gdeglin?
Peter Berg
3
Isso pode ser usado quando você deseja manter outros parâmetros, mas exclui um par de valores-chave em particular.
Lavixu 17/01
1
Isso não redefinirá a sessão, ele atribuirá uma variável local. Nunca use esta técnica para redefinir a sessão: session = {}
alexspeller
4
A documentação do Rails , na seção 5.1 . Se você deseja redefinir apenas os pares de chave / valor definidos, defina essas chaves como nulas.
Sargas
1
@ Barlop Parece que você provavelmente está melhor usando reset_session, como faz algumas outras limpezas além do que session.clearacontece. Internamente, as reset_sessionchamadassession.destroy , que também chamam de clearoutras coisas .
lobati
6

excluir a sessão de um usuário

session.delete(:user_id)
vjnan369
fonte
Cuidado, você pode excluir o registro do usuário do banco de dados!
Arthur
2
@ Arthur Isso não é verdade. Mas você excluirá apenas a chave: user_id da sessão e não a sessão inteira #
Andión
5

Para limpar apenas determinados parâmetros, você pode usar:

[:param1, :param2, :param3].each { |k| session.delete(k) }
vladCovaliov
fonte
2

adicione esse código ao seu ApplicationController

def reset_session
  @_request.reset_session
end

(Não sei por que ninguém acima apenas mencionou esse código, pois corrigiu meu problema) http://apidock.com/rails/ActionController/RackDelegation/reset_session

David Mesaros
fonte
Acho isso @_request.reset_sessione reset_sessionambos funcionam e talvez façam a mesma coisa?
Barlop