- Rotaie: 3.0.3
- rubino: 1.9.2
Cercando di deserializzare un oggetto molto semplice usando YAML.load
o Marshal.load
producono un corrotto oggetto perché la classe a cui appartiene non è richiesta nel processo di deserializzazione.rotaie non caricare classi sulla deserializzazione YAML/Marshal oggetti
Esempio:
# app/models/my_model.rb
class MyModel
attr_accessor :id
end
# test/unit/serializing_test.rb
require 'test_helper'
class SerializingTest < Test::Unit::TestCase
def test_yaml_serialize_structure
my_model = MyModel.new
my_model.id = 'my model'
File.open("#{Rails.root}/tmp/object.yml" , 'w') do |f|
YAML::dump(my_model, f)
end
end
def test_yaml_deserialize_structure
object = YAML.load_file "#{Rails.root}/tmp/object.yml"
assert(object.instance_of? MyModel)
assert_equal('my model', object.id)
end
end
Con questo codice si può eseguire questa sessione di console di shell senza alcun errore:
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_serialize_structure
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_deserialize_structure
Ma se faccio funzionare il deserializzazione chiama da un Rails console l'oggetto è non deserializzato correttamente perché la classe non è mai richiesta:
$ rails c
ruby-1.9.2-p0 > object = YAML.load_file "#{Rails.root}/tmp/object.yml"
=> #<Syck::Object:0x0000010322ea30 @class="MyModel", @ivars={"id"=>"my model"}>
so l'unico problema è che la classe non è necessario perché se ho bisogno a mano tutto funziona:
ruby-1.9.2-p0 > require "#{Rails.root}/app/models/my_model"
=> ["MyModel"]
ruby-1.9.2-p0 > object = YAML.load_file "#{Rails.root}/tmp/object.yml"
=> #<MyModel:0x0000010320c8e0 @id="my model">
ho presentato solo gli esempi YAML, ma con il maresciallo è abbastanza lo stesso.
anche dire che anche se sto riprodurre il problema in una console Rails originariamente questo problema stava girando impazzire in una richiesta normale alla mia richiesta.
Quindi la domanda è: Come posso deserializzare oggetti in Rails senza dover richiedere manualmente tutte le mie classi?
Grazie
f.
ho solo capito che questo solo happend in un ambiente di sviluppo ** **. – fguillen
Sto vedendo che se attivo 'config.cache_classes' la deserializzazione funziona bene, ma ovviamente: ** Ho perso la classe di aggiornamento automatico **:/ – fguillen