是通过部分实现递归的最佳实践吗?

时间:2008-10-31 07:31:30

标签: ruby-on-rails recursion

我需要在HTML中显示嵌套的set结构。我正在做以下部分:

<ul<%= ' id="tree"' if depth == 0 %>>
<% items.each do |item| %>
  <li id="node_<%= item.id %>"><a><%= item.name %></a>
  <% if item.has_children? %>
    <%= render :partial => 'tree_level', :locals => {:items => item.children, :depth => depth + 1} %>
  <% end %>
  </li>
<% end %>   
</ul>

这是获得代码的最佳位置吗?我“感觉”就像对象上应该有一个to_html方法,它会为我转储整个树结构,尽管这样可行。

2 个答案:

答案 0 :(得分:2)

我不确定这是否是最佳做法,但我使用类似的代码来渲染项目树。

更快的替代方法是创建执行相同作业的辅助方法(递归遍历树并将部分字符串添加到结果字符串中)。它有点PHP风格:(但对于如此少量的HTML,它可以,我猜:)

助手看起来像:

def render_node(node)
  res = "<ul>"
  ...
  node.items.each {|n| res << render_node(n)}
  ...
  res << "</ul>"
  res
end

然后就像这样使用:

<%=render_node ProjectTree.new%>

答案 1 :(得分:0)

好吧,你应该意识到使用partials有一个(小)开销,所以如果性能是一个问题,你可能不想这么用它们。否则我发现使用它有点问题。

但是,您可能希望使用部分的集合变体(请参阅“渲染部分集合”on this API page,它可能会稍微清理您的代码。