Merge pull request #8199 from senny/backport_8182

backport #8185, `#as_json` isolates options when encoding a hash.
This commit is contained in:
Carlos Antonio da Silva
2012-11-13 02:26:01 -08:00
3 changed files with 24 additions and 1 deletions

View File

@@ -1,5 +1,10 @@
## Rails 3.2.10 (unreleased)
* `#as_json` isolates options when encoding a hash. [Backport #8185]
Fix #8182
*Yves Senn*
* Handle the possible Permission Denied errors atomic.rb might trigger due to
its chown and chmod calls. [Backport #8027]

View File

@@ -61,7 +61,7 @@ module ActiveSupport
# hashes and arrays need to get encoder in the options, so that they can detect circular references
options.merge(:encoder => self)
else
options
options.dup
end
end

View File

@@ -22,6 +22,15 @@ class TestJSONEncoding < Test::Unit::TestCase
end
end
class CustomWithOptions
attr_accessor :foo, :bar
def as_json(options={})
options[:only] = %w(foo bar)
super(options)
end
end
TrueTests = [[ true, %(true) ]]
FalseTests = [[ false, %(false) ]]
NilTests = [[ nil, %(null) ]]
@@ -239,6 +248,15 @@ class TestJSONEncoding < Test::Unit::TestCase
assert_equal(%([{"address":{"city":"London"}},{"address":{"city":"Paris"}}]), json)
end
def test_to_json_should_not_keep_options_around
f = CustomWithOptions.new
f.foo = "hello"
f.bar = "world"
hash = {"foo" => f, "other_hash" => {"foo" => "other_foo", "test" => "other_test"}}
assert_equal(%({"foo":{"foo":"hello","bar":"world"},"other_hash":{"foo":"other_foo","test":"other_test"}}), hash.to_json)
end
def test_struct_encoding
Struct.new('UserNameAndEmail', :name, :email)
Struct.new('UserNameAndDate', :name, :date)