我有一个使用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并保留该分离?
谢谢!
答案 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>