Rails会话需要“检查”被称为

问题描述:

我使用Rails会话来存储我从Mechanize获得的cookie_jar。这让我可以调用web服务并维护它发回的cookie。Rails会话需要“检查”被称为

类发生在它的构造会话,所以我传递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会话的行为是这样吗?

尝试这样代替:通过不坚持,它给你一个真实的字符串

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

你可能已经击败了一些轨道的元编程的魔力。会话是类似哈希的对象,但不是真正的哈希。

更新:寻找与源API文档,这不是元编程,但只是简单的逻辑:

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

SessionHash 从哈希衍生而来,但只有少数方法得到延迟加载包装,并has_key?不其中之一。