diff --git a/lib/redmine/views/builders/structure.rb b/lib/redmine/views/builders/structure.rb index 06e176937..50a81487f 100644 --- a/lib/redmine/views/builders/structure.rb +++ b/lib/redmine/views/builders/structure.rb @@ -43,7 +43,11 @@ module Redmine end else if @struct.last.is_a?(Array) - @struct.last << (args.last || {}).merge(:value => args.first) + if args.size == 1 && !block_given? + @struct.last << args.first + else + @struct.last << (args.last || {}).merge(:value => args.first) + end else @struct.last[sym] = args.first end diff --git a/test/unit/lib/redmine/views/builders/json_test.rb b/test/unit/lib/redmine/views/builders/json_test.rb index 1f09f3718..8e09d9b29 100644 --- a/test/unit/lib/redmine/views/builders/json_test.rb +++ b/test/unit/lib/redmine/views/builders/json_test.rb @@ -73,6 +73,19 @@ class Redmine::Views::Builders::JsonTest < ActiveSupport::TestCase end end + def test_nested_arrays + assert_json_output({'books' => [{'authors' => ['B. Smith', 'G. Cooper']}]}) do |b| + b.array :books do |books| + books.book do |book| + book.array :authors do |authors| + authors.author 'B. Smith' + authors.author 'G. Cooper' + end + end + end + end + end + def assert_json_output(expected, &block) builder = Redmine::Views::Builders::Json.new block.call(builder) diff --git a/test/unit/lib/redmine/views/builders/xml_test.rb b/test/unit/lib/redmine/views/builders/xml_test.rb index cdac8da2b..0f895cc93 100644 --- a/test/unit/lib/redmine/views/builders/xml_test.rb +++ b/test/unit/lib/redmine/views/builders/xml_test.rb @@ -46,6 +46,19 @@ class Redmine::Views::Builders::XmlTest < ActiveSupport::TestCase end end + def test_nested_arrays + assert_xml_output('B. SmithG. Cooper') do |b| + b.array :books do |books| + books.book do |book| + book.array :authors do |authors| + authors.author 'B. Smith' + authors.author 'G. Cooper' + end + end + end + end + end + def assert_xml_output(expected, &block) builder = Redmine::Views::Builders::Xml.new block.call(builder)