Skip to content

Commit 823d3ed

Browse files
committed
deep merge blocks
1 parent 6627fd2 commit 823d3ed

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

lib/jbuilder.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,9 @@ def _merge_values(current_value, updates)
275275
elsif ::Array === current_value && ::Array === updates
276276
current_value + updates
277277
elsif ::Hash === current_value && ::Hash === updates
278-
current_value.merge(updates)
278+
current_value.merge(updates) do |key, sub_current_value, sub_updates|
279+
_merge_values(sub_current_value, sub_updates)
280+
end
279281
else
280282
raise MergeError.build(current_value, updates)
281283
end

test/jbuilder_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,22 @@ class JbuilderTest < ActiveSupport::TestCase
159159
assert_equal 32, result['author']['age']
160160
end
161161

162+
test 'inner blocks merge arrays' do
163+
result = jbuild do |json|
164+
json.inner { json.foo [1, 2] }
165+
json.inner { json.foo [3, 4] }
166+
end
167+
assert_equal [1, 2, 3, 4], result['inner']['foo']
168+
end
169+
170+
test 'inner blocks merge hashes' do
171+
result = jbuild do |json|
172+
json.inner { json.foo { json.bar 1 } }
173+
json.inner { json.foo { json.baz 2 } }
174+
end
175+
assert_equal({ 'bar' => 1, 'baz' => 2 }, result['inner']['foo'])
176+
end
177+
162178
test 'support merge! method' do
163179
result = jbuild do |json|
164180
json.merge! 'foo' => 'bar'

0 commit comments

Comments
 (0)