3

当我序列化活动记录时,我发现 yaml 格式因我运行的机器而异。在一个盒子上,我得到:

object: !ruby/object:User 

代替

object: !ruby/ActiveRecord:User 

第一个版本是一个问题,因为当 yaml 被反序列化时,主动支持需要做一些魔法来正确填充活动记录。是什么导致了这种差异,我如何确保使用第二种格式?


我正在使用 ruby​​ 1.9.2 并且我已经强制 yaml 引擎使用 syck 使用

require "yaml"
YAML::ENGINE.yamler = "syck"

在 boot.rb(rails 应用程序)中。

更新

进一步挖掘后,我发现 ActiveRecord 类型没有在 yaml 中注册。在它工作的服务器上进行以下调用:

YAML.resolver.tags.keys

包括:

"tag:ruby.yaml.org,2002:ActiveRecord"

行为不正确的服务器缺少此类型。现在的问题是我不知道为什么没有注册该类型。

4

2 回答 2

0

这种类型的问题通常是由 Rails 类重新加载引起的。您是否尝试设置:

 config.cache_classes = true

在 config/environments/development.rb 中?

于 2011-03-21T15:56:22.300 回答
0

问题原来是我在原始问题中没有提到的几个不同环境问题之间的相互作用。

所以问题原来是乘客的配置问题。如果您的项目中有一个位于 config/setup_load_paths.rb 的文件,那么您的 Gemfile 不会被加载。我加了

require "yaml"
YAML::ENGINE.yamler = "syck"

在我的 Gemfile 顶部,以确保在加载 rails 并使用 yaml 注册它的活动记录转换器之前选择了引擎。乘客没有运行 Gemfile,因此引擎从未设置好,并且 ruby​​ 默认为 pysch 而不是 syck。当前版本的delayed_job 强制使用syck,但由于正在加载syck,syck 引擎从未注册过活动记录转换器。

于 2011-03-21T17:15:16.667 回答