- Schienen: 3.0.3
- Rubin: 1.9.2
ein sehr einfaches Objekt mit YAML.load
oder Marshal.load
erzeugt eine beschädigte deserialisieren Der Versuch Objekt, weil die Klasse, zu der gehört, beim Deserialisierungsprozess nicht benötigt wird.Rails nicht Klassen laden auf Deserialisieren YAML/Marshal Objekte
Beispiel:
# 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
Mit diesem Code wir diese Shell-Konsole-Sitzung ohne Fehler ausführen können:
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_serialize_structure
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_deserialize_structure
Aber wenn ich laufen die Deserialisierung aus einer Rails das Objekt Konsole nennt, ist wird nicht richtig deserialisiert, weil die Klasse niemals benötigt wird:
$ 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"}>
Ich weiß, das einzige Problem ist, dass die Klasse nicht, weil erforderlich ist, wenn ich es erfordern von Hand alles funktioniert:
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">
ich nur die YAML Beispiele vorgestellt haben, aber mit Marschall ist ziemlich gleich.
Auch sagen, dass, obwohl ich das Problem in einer Rails-Konsole reproduzieren ursprünglich dieses Problem wurde mich verrückt in einer normalen Anfrage an meine Anwendung.
So ist die Frage: Wie kann ich Objekte in Rails deserialize ohne alle meine Klassen von Hand erfordern?
Dank
f.
Ich habe gerade festgestellt, dass dies nur geschieht in einer ** Entwicklungsumgebung **. – fguillen
Ich sehe, dass, wenn ich 'config.cache_classes' aktiviere die Deserialisierung gut funktioniert, aber natürlich: ** Ich habe die Klasse automatisches Auffrischen verloren **:/ – fguillen