当我序列化活动记录时,我发现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 app)中。
进一步挖掘后,我发现ActiveRecord类型没有在yaml中注册。在它运行的服务器上进行以下调用:
YAML.resolver.tags.keys
包括:
"tag:ruby.yaml.org,2002:ActiveRecord"
行为不正确的服务器缺少此类型。现在的问题是我不知道为什么没有注册这个类型。
答案 0 :(得分:0)
这类问题通常是由Rails类重新加载引起的。你尝试过设置:
config.cache_classes = true
在config / environments / development.rb中?
答案 1 :(得分:0)
问题原来是我在原始问题中没有提到的几个不同环境问题之间的相互作用。
所以问题原来是乘客的配置问题。如果项目中的文件位于config / setup_load_paths.rb,则不会加载您的Gemfile。我添加了
require "yaml"
YAML::ENGINE.yamler = "syck"
在我的Gemfile顶部,以确保在加载rails之前选择了引擎,并使用yaml注册了它的活动记录转换器。 Passenger没有运行Gemfile,因此引擎永远不会被设置,而ruby默认为pysch而不是syck。当前版本的delayed_job强制使用syck,但由于正在加载心理,所以syck引擎从未在其中注册过活动记录转换器。