递归创建索引栏(基于UL,LI)

时间:2009-08-25 05:29:21

标签: ruby-on-rails recursion nested

我正在使用awesome_nested_set作为我的中心网站结构。我希望能够从嵌套集构建基于UL / LI的索引条,但也希望它利用嵌套集的低数据库密集度。当我使用acts_as_tree时,我有一个构建索引栏的递归函数。如果遇到任何孩子等,它就会自动调用...我想知道是否有更好的方法来使用nested_set。到目前为止,我已经提出了以下内容(未经测试):

  def recursive_indexbar(parent, parameters)
    return unless parameters.length == 1 && parameters.first.to_i > 0

    maximum_level = parent.level + parameters.first

    content_tag :ul do
      parent.descendants.current.visible.front_end.recurse do |component_instance, block|
        content_tag :li, :class => (@item.component_instance == component_instance) ? 'uber' : false do
          component_instance.name
          unless component_instance.leaf?
            content_tag :ul, block.call
          end
        end
      end
    end
  end

现在它实际上没有用,因为nested_set中没有递归函数,我只是从这个链接中选择了它:http://dev.rubyonrails.org/ticket/9678。请参阅页面上的最新评论。

还有一个设施只能进行如此多的深度,但这很容易实现。

任何人都可以给我任何指示吗?

1 个答案:

答案 0 :(得分:1)

所以我会回答它:)基本上我使用lambda和返回函数来帮助创建一堆带内容的嵌套数组。然后视图将其反编译为直接文本:

  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而不是每个(这似乎更合乎逻辑)。 Collect返回一个我们想要的数组。如果在原始数组中停止追加或嵌套,整个过程就会崩溃:)

希望这可以帮助将来的某个人。它是一个但我的用途定制,但将转移到任何树结构。我觉得让它与嵌套集有效地工作会很酷但是由于索引栏通常只有一两层,因此递归不会失控。