30

在 ruby​​ on rails 中,这样做session[:foo] = nil时会留下一个:foo在会话对象中命名的条目。如何从会话对象中删除该单个条目?

4

3 回答 3

81

看起来最简单的版本可以工作。所有存储(Cookie、文件、ActiveRecord...)都AbstractStore::SessionHash用作包含数据的对象,不同的存储仅提供加载和保存AbstractStore::SessionHash实例的方法。

AbstractStore::SessionHash继承自Hash,因此这取决于Hash#delete方法:

session.delete(:key_to_delete)
于 2011-02-09T08:43:04.423 回答
8

实际上有一种方法可以从会话中删除一个值。就像 RichH 所说的会话变量是一个 CGI::Session 实例。当输入类似的内容时,实际上是在会话对象的实例变量中session[:foo]查找该符号。@data该数据变量是一个散列。

编辑: CGI::Session 类中有一个数据实例变量。如果您转到文档并查看该[]=方法的源代码,您会看到有一个@data成员。

因此,要删除session[:foo]您所要做的就是@data从会话内部访问该变量

   session.data[:foo]

现在删除它:

   session.data.delete :foo

一旦你这样做了,你的会话变量中就不应该有 foo 了。

于 2009-03-26T08:10:24.443 回答
2

由于 Session 是 Ruby CGI::Session而不是 Hash,调用 delete 实际上会删除 session。删除不带参数 - 这是我在尝试 hyuan 建议时收到“错误数量的参数(1 或 0)”消息。

清除会话条目的普遍接受的方法是 session[:foo] = nil 正如您所建议的那样。这远非理想,但是像 session[:foo].nil 这样的语句?将按预期运行。

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

于 2009-03-26T07:58:15.520 回答