在执行session[:foo] = nil
时,在ruby on rails中,会在会话对象中留下名为:foo
的条目。如何从会话对象中删除单个条目?
答案 0 :(得分:78)
看起来最简单的版本。所有商店(Cookie,File,ActiveRecord,...)都使用AbstractStore::SessionHash
作为包含数据的对象,不同的商店仅提供加载和保存AbstractStore::SessionHash
实例的方法。
AbstractStore::SessionHash
继承自Hash
,因此这推迟到Hash#delete
方法:
session.delete(:key_to_delete)
答案 1 :(得分:8)
实际上有一种方法可以从会话中删除一个值。和RichH一样,会话变量是一个CGI :: Session实例。输入类似session[:foo]
的内容时,它实际上是在会话对象的@data
实例变量中查找该符号。该数据变量是一个哈希值。
编辑: CGI :: Session类中有一个数据实例变量。如果您转到docs并查看[]=
方法的源代码,您会看到有@data
成员。
所以要删除session[:foo]
所有你需要做的就是从会话中访问@data
变量
session.data[:foo]
现在删除它:
session.data.delete :foo
执行此操作后,会话变量中不应再有foo。
答案 2 :(得分:2)
由于Session是Ruby CGI::Session而不是Hash,调用delete实际上会删除session。删除不带任何参数 - 当你尝试使用hyuan建议时,这是我得到的“错误的参数数量(1或0)”消息。
清除会话条目的普遍接受的方法是使用会话[:foo] = nil,如您所建议的那样。它远非理想,但会话如会话[:foo] .nil?将按预期行事。
我真的希望它表现得像普通的哈希......但事实并非如此。