如何在rails会话中清除ruby中的单个条目?

时间:2009-03-26 03:52:30

标签: session ruby-on-rails-2

在执行session[:foo] = nil时,在ruby on rails中,会在会话对象中留下名为:foo的条目。如何从会话对象中删除单个条目?

3 个答案:

答案 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?将按预期行事。

我真的希望它表现得像普通的哈希......但事实并非如此。