gpt4 book ai didi

ruby-on-rails - 在rails中递归渲染树

转载 作者:行者123 更新时间:2023-12-04 17:23:40 25 4
gpt4 key购买 nike

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

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

使用递归函数通常应该很容易。但是 Rails 强制严格区分代码和内容。

递归地将树呈现为 HTML-List 并保留这种分离的“rails 方式”是什么?

谢谢!

最佳答案

有两种方法:

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

我不知道acts_as_tree是如何工作的,但我会演示一下acts_as_nested_set是如何工作的,应该是相似的。

由于您询问递归方式,您可以在 View 范围的函数中将内容与 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 的方法与上述类似,但不是调用函数,而是为节点渲染一个 partial。但我的印象是(我没有测试过)递归函数的渲染速度应该比局部函数快一点。

更新

对于 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>

关于ruby-on-rails - 在rails中递归渲染树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27210244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com