diff --git a/lib/jbuilder.rb b/lib/jbuilder.rb index d84eab2..46dcc65 100644 --- a/lib/jbuilder.rb +++ b/lib/jbuilder.rb @@ -275,7 +275,9 @@ def _merge_values(current_value, updates) elsif ::Array === current_value && ::Array === updates current_value + updates elsif ::Hash === current_value && ::Hash === updates - current_value.merge(updates) + current_value.merge(updates) do |key, sub_current_value, sub_updates| + _merge_values(sub_current_value, sub_updates) + end else raise MergeError.build(current_value, updates) end diff --git a/test/jbuilder_test.rb b/test/jbuilder_test.rb index 87bf81b..844bba9 100644 --- a/test/jbuilder_test.rb +++ b/test/jbuilder_test.rb @@ -159,6 +159,22 @@ class JbuilderTest < ActiveSupport::TestCase assert_equal 32, result['author']['age'] end + test 'inner blocks merge arrays' do + result = jbuild do |json| + json.inner { json.foo [1, 2] } + json.inner { json.foo [3, 4] } + end + assert_equal [1, 2, 3, 4], result['inner']['foo'] + end + + test 'inner blocks merge hashes' do + result = jbuild do |json| + json.inner { json.foo { json.bar 1 } } + json.inner { json.foo { json.baz 2 } } + end + assert_equal({ 'bar' => 1, 'baz' => 2 }, result['inner']['foo']) + end + test 'support merge! method' do result = jbuild do |json| json.merge! 'foo' => 'bar'