diff --git a/lib/jbuilder.rb b/lib/jbuilder.rb index ee128db5..defd55ed 100644 --- a/lib/jbuilder.rb +++ b/lib/jbuilder.rb @@ -241,8 +241,15 @@ def attributes! @attributes end - # Merges hash or array into current builder. - def merge!(hash_or_array) + # Merges hash, array, or Jbuilder instance into current builder. + def merge!(obj) + hash_or_array = + if ::Jbuilder === obj + obj.attributes! + else + obj + end + @attributes = _merge_values(@attributes, hash_or_array) end diff --git a/test/jbuilder_test.rb b/test/jbuilder_test.rb index c0eb8476..5f46ea84 100644 --- a/test/jbuilder_test.rb +++ b/test/jbuilder_test.rb @@ -196,6 +196,18 @@ class JbuilderTest < ActiveSupport::TestCase assert_equal 'Pavel', result['author']['name'] end + test 'support merge! method with Jbuilder instance' do + obj = jbuild do |json| + json.foo 'bar' + end + + result = jbuild do |json| + json.merge! obj + end + + assert_equal 'bar', result['foo'] + end + test 'blocks are additive via extract syntax' do person = Person.new('Pavel', 27)