2011-01-12 75 views
3

假設我有一個User < ActiveRecord::Base。 現在,假設我想創建一個用戶實例,驗證它並將它存儲在會話中,如果我無法保存它。如何解決Marshal.dump「沒有marshal_dump爲類Proc定義」錯誤

user = User.new 
... 
session[:new_user] = user unless user.save 
... 

使用ActiveRecord的會議一個可能最終no marshal_dump is defined for class ProcMarshal.dump到來。

現在,什麼是解決這種序列化錯誤(找到一個對象「無效的」Proc對象)的最佳方法(通常不一定是AR)?

回答

5

通常最好將用戶id存儲在會話中,而不是User實例本身。這確實意味着您必須爲經過身份驗證的請求執行db(或memcache)查找,但它可以節省大量您需要處理的序列化/緩存問題。

另外,它在某種意義上不是「無效的」ProcProc實例是Ruby代碼和應用程​​序狀態的容器,因此無法序列化。

+0

THX重建的對象,但我的AR樣品建議我不能存儲的用戶ID - 這是一個短暫的例子。我知道這是「軌道」的方式,但嘿它應該是一個任意對象的會話存儲...跛腳,不能存儲模型實例:-(...我也沒有發現memcache一個可用的選項。 – kares 2011-01-13 17:15:38

1

對於這個特定的情況,我會說,只存儲attributesActiveRecord::Base#attributes返回存儲在數據庫中的屬性的散列,所以它幾乎肯定不包含任何Proc

session[:new_user] = user.attributes unless user.save 

但一般情況下,一個簡單的方法就是你要當元帥的物體上使用inspect

puts obj.inspect 

或等價

p obj 

通常這將打印內部的對象,你可以看到的東西是否是一個Proc。如果您仍然無法找到它並且需要深入挖掘,那麼可以檢查該對象的所有成員變量。

obj.instance_variables.each do |var| 
    puts "#{var} = #{obj.instance_eval(var).inspect}" 
end 
0

我試圖在會話中存儲未保存的AR對象時遇到此問題。 由於我正在處理任意模型,因此我必須將類和屬性 存儲在會話中,以便稍後重建它。我解決了這個通過保存類,並在會議上共同屬性:

session[:key] = {:klass => obj.class.to_s, :attributes => obj.attributes} 

然後我可以從會話

obj = session[:key][:klass].constantize.new(session[:key][:attributes]) 
相關問題