2009-11-18 96 views
0

我使用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會話的行爲是這樣嗎?

回答

3

嘗試這樣代替:通過不堅持,它給你一個真實的字符串

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