ActiveRecords неправильно сериализован в yaml

Когда я сериализую активные записи, я обнаруживаю, что формат 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"

Этот тип отсутствует на сервере, который ведет себя неправильно. Проблема сейчас в том, что я понятия не имею, почему тип не зарегистрирован.

2 ответа

Решение

Проблема оказалась взаимодействием между несколькими проблемами окружающей среды, которые я не упомянул в первоначальном вопросе.

Таким образом, проблема оказалась проблемой конфигурации с пассажиром. Если в вашем проекте есть файл config/setup_load_paths.rb, ваш Gemfile не загружается. Я добавил

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

вверху моего Gemfile, чтобы убедиться, что двигатель был выбран до того, как рельсы были загружены и зарегистрированы, это активный конвертер записей с yaml. Пассажир не запускал Gemfile, поэтому двигатель никогда не заводился, а ruby ​​по умолчанию использовал pysch вместо syck. Текущая версия delayed_job заставляет использовать syck, но, поскольку psy загружается, ядро ​​syck никогда не регистрировало активный конвертер записей.

Этот тип проблемы обычно вызывается перезагрузкой класса Rails. Вы пробовали установить:

 config.cache_classes = true

в конфиге / средах / разработке.рб?

Другие вопросы по тегам