如何解决Marshal.dump"没有为类Proc定义marshal_dump"错误

kar*_*res 3 ruby serialization ruby-on-rails

假设我有一个User < ActiveRecord::Base.现在,假设我想创建一个用户实例,验证它并将其存储在会话中,如果我无法保存它.

user = User.new
...
session[:new_user] = user unless user.save
...
Run Code Online (Sandbox Code Playgroud)

使用ActiveRecord会话可能最终no marshal_dump is defined for class Proc会来自Marshal.dump.

现在,解决此类序列化错误(找到"无效" Proc对象)的最佳方法是什么(通常不一定是AR)?

Bri*_*van 5

通常最好将用户ID存储在会话中,而不是User实例本身.这确实意味着您必须对经过身份验证的请求执行db(或memcache)查找,但它可以为您节省大量序列化/缓存的麻烦,否则您将不得不处理这些问题.

而且,从Proc某种意义上说,它不是"无效的" .Proc实例是Ruby代码和应用程​​序状态的容器,因此无法进行序列化.

  • 我同意,现在的问题是:"解决此类序列化错误的最佳方法是什么(找到Proc对象)?" ... (2认同)