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?
不其中之一。