在rails中递归渲染树

时间:2014-11-30 05:08:45

标签: ruby-on-rails tree

我有一个使用acts_as_tree的模型,我想将其呈现为嵌套的HTML列表:

<ol>
 <li> Content goes here
  <ol> recursion
    <li>goes</li>
  <ol> here
 </li>
</ol>

使用递归函数通常很容易。但rails强制严格分离代码和内容。

&#39; rails way&#39;是什么?以递归方式将树呈现为HTML-List并保留该分离?

谢谢!

1 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点:

  • 部分方式
  • 递归函数方式

我不知道acts_as_tree的工作原理,但我会演示acts_as_nested_set的工作原理,它应该是相似的。

由于您询问递归方式,您可以在视图范围的函数中将内容与ruby分开:

<%
  def draw_tree(node)
    node.children.each do |child|
%>
      <li><%= child.name %>
<%
          if child.children.any?
%>
              <ol><% draw_tree(child) %></ol>
<%
          end
%>
      </li>
<%
    end; nil
  end
%>

然后,为所有根节点渲染树(我再说一遍,这是acts_as_nested_set,你必须适应它 - 这应该不难):

<ol>
    <% Model.roots.each do |node| %>
        <li>
            <%= node.name %>
            <% if node.children.any? %>
                <ol><%= draw_tree(node) %></ol>
            <% end %>
        </li>
    <% end %>
</ol>

以上所有代码都应位于同一模板中(.html.erb)。当然,您可以进行分区。

使用partials的方法类似于上面的方法,但不是调用函数,而是为节点渲染部分函数。但我有一种印象(我没有测试过),递归函数的呈现速度应该比部分快一些。

<强>更新

对于acts_as_tree,您只需要:

root=Model.where(parent_id:nil).first

所以:

<% root=Model.where(parent_id:nil).first %>
<ol>
    <% root.children.each do |node| %>
        <li>
            <%= node.name %>
            <% if node.children.any? %>
                <ol><%= draw_tree(node) %></ol>
            <% end %>
        </li>
    <% end %>
</ol>