3

アクティブなレコードをシリアル化すると、実行しているボックスによってyamlの形式が異なることがわかります。1つの箱で私は得る:

object: !ruby/object:User 

それ以外の

object: !ruby/ActiveRecord:User 

最初のバージョンは問題です。yamlが逆シリアル化されたときにアクティブサポートがアクティブレコードを正しく入力するために何らかの魔法をかける必要があるためです。この違いの原因と、2番目の形式が使用されていることを確認するにはどうすればよいですか?


私はruby1.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 / environment / 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はデフォルトでsyckではなくpyschに設定されていました。現在のバージョンのdelayed_jobはsyckの使用を強制しますが、psychがロードされていたため、syckエンジンにはアクティブレコードコンバーターが登録されていませんでした。

于 2011-03-21T17:15:16.667 に答える