Итак, я отвечу на это :). В основном, я использовал лямбду и функцию возврата, чтобы помочь создать кучу вложенных массивов с содержимым. Затем представление декомпилирует это в простой текст:
def new_recursive(parent, parameters)
return unless parameters.length == 1 && parameters.first.to_i > 0
maximum_level = parent.level + parameters.first
recurse = lambda do |component_instance|
component_instance.children.current.visible.front_end.collect do |child|
content_tag :li, :class => (@item.component_instance == child ? 'uber' : nil) do
returning [] do |content|
content << link_to(child.name, [child.parent, child.instance])
unless child.leaf? || child.level == maximum_level
content << content_tag(:ul, recurse.call(child))
end
end
end
end
end
content_tag :ul, recurse.call(parent)
end
Обратите внимание также на использование сбора, а не каждого (что может показаться более логичным). Collect возвращает массив, который мы и хотим. Если прекратить добавление или вложение в исходном массиве, все разрушится:)
Надеюсь, это поможет кому-то в будущем. Это настроено для моих целей, но будет перенесено в любую древовидную структуру. Полагаю, что заставить его работать с вложенным множеством эффективно, было бы здорово, но так как индикаторный бар обычно имеет глубину всего один или два уровня, рекурсивность не выйдет из-под контроля.