Rails会话需要“检查”才能被调用

时间:2009-11-18 16:43:49

标签: ruby-on-rails ruby session

我正在使用Rails会话来存储我从Mechanize获得的cookie_jar。这让我可以调用web服务并维护它发回的cookie。

该类在它的构造函数中占用一个会话,所以我正在传递Rails会话。然后,当我调用该服务时,我加载了cookie_jar(如果我有的话),如:

agent =  WWW::Mechanize.new
agent.cookie_jar = YAML.load(@session[COOKIE_JAR]) if @session.has_key? COOKIE_JAR

一旦我完成了通话,我就会再次存储cookie_jar:

@session[COOKIE_JAR] = agent.cookie_jar.to_yaml

虽然我只想存储“代理”,但它无法序列化(因此无法进入会话)。这是时髦的部分: 如果我在我的类构造函数中调用“session.inspect”(或者在检查会话是否有我正在寻找的密钥之前的任何时候),一切正常。删除对“session.inspect”的调用,它不再起作用了。

任何人都知道为什么Rails会话会以这种方式运行?

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

cj = @session[COOKIE_JAR]
agent.cookie_jar = YAML.load(cj) unless cj.nil?

你可能已经打败了一些rails元编程魔术,并没有坚持它会给你一个实际的字符串。会话是类似哈希的对象,但不是真正的哈希。

更新:用源代码查看API文档,它不是元编程,而只是简单的逻辑:

    # File actionpack/lib/action_controller/session/abstract_store.rb, line 27
27:         def [](key)
28:           load! unless @loaded
29:           super
30:         end

SessionHash 派生自Hash,但只有少数方法获取延迟加载包装,而has_key?不是其中之一。