我正在使用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会话会以这种方式运行?
答案 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?
不是其中之一。