Use encode_with for marshalling

This commit is contained in:
Jon Leighton 2011-01-06 17:01:24 +00:00 committed by Aaron Patterson
parent 2efd780dcb
commit 441118458d
2 changed files with 27 additions and 0 deletions

@ -870,6 +870,16 @@ def before_remove_const #:nodoc:
reset_scoped_methods
end
# Specifies how the record is loaded by +Marshal+.
#
# +_load+ sets an instance variable for each key in the hash it takes as input.
# Override this method if you require more complex marshalling.
def _load(data)
record = allocate
record.init_with(Marshal.load(data))
record
end
private
def relation #:nodoc:
@ -1425,6 +1435,16 @@ def init_with(coder)
_run_initialize_callbacks
end
# Specifies how the record is dumped by +Marshal+.
#
# +_dump+ emits a marshalled hash which has been passed to +encode_with+. Override this
# method if you require more complex marshalling.
def _dump(level)
dump = {}
encode_with(dump)
Marshal.dump(dump)
end
# Returns a String, which Action Pack uses for constructing an URL to this
# object. The default implementation returns this record's id as a String,
# or nil if this record's unsaved.

@ -1503,4 +1503,11 @@ def test_default_scope_is_reset
ensure
Object.class_eval{ remove_const :UnloadablePost } if defined?(UnloadablePost)
end
def test_marshal_round_trip
expected = posts(:welcome)
actual = Marshal.load(Marshal.dump(expected))
assert_equal expected.attributes, actual.attributes
end
end