Ruby on rails 将具有深度值的记录数组映射到嵌套无序列表

Ruby on rails 将具有深度值的记录数组映射到嵌套无序列表,ruby-on-rails,arrays,mapping,html-lists,Ruby On Rails,Arrays,Mapping,Html Lists,我希望以前没有人问过这个问题: 我正在使用祖先宝石来管理我的树结构。我正在使用一个函数,它将节点的后代返回到一定数量的级别。下面是一个简单的例子,说明它返回了什么: [{:name => 'node 1', :depth => 1}, {:name => 'node 2', :depth => 2} {:name => 'node 3', :depth => 1}, {:name => 'node 4', :depth => 1}] 事实上,这

我希望以前没有人问过这个问题:

我正在使用祖先宝石来管理我的树结构。我正在使用一个函数,它将节点的后代返回到一定数量的级别。下面是一个简单的例子,说明它返回了什么:

[{:name => 'node 1', :depth => 1}, {:name => 'node 2', :depth => 2}
 {:name => 'node 3', :depth => 1}, {:name => 'node 4', :depth => 1}]
事实上,这些记录的顺序是正确的,这样所有的孩子,孙子等等。。。一条记录的子节点出现在该记录之后,因此我们可以假设“节点2”是“节点1”的子节点。我们还可以用方法返回的额外信息来证明这一点,我在本例中没有包括这些信息,以使其更简单

我想以最有效的方式将此列表转换为无序列表:

<ul>
  <li>node 1
    <ul>
      <li>node 2</li>
    </ul>
  </li>
  <li>node 3</li>
  <li>node 4</li>
</ul>
  • 节点1
    • 节点2
  • 节点3
  • 节点4
这就是我被困的地方。拥有一个像上面这样的有序值数组对于避免产生嵌套无序列表通常需要使用的递归代码非常有用。我想也许简单地映射数组的成员并插入适当的UL和LI将是最快的方法

期待看到您的想法


Brendon

这个ERB模板应该可以做到这一点。将代码提取到帮助器或分部以保持整洁

<%
# lets assume that your array is an a variable
# called list
list = [ {:name => 'node 1', :depth => 1}, 
         {:name => 'node 2', :depth => 2},
         {:name => 'node 3', :depth => 1}, 
         {:name => 'node 4', :depth => 1}]

%>
<% depth = 1%>
<ul>
<%list.each do |cfg|%>
  <%if depth < cfg[:depth] %> 
    <ul>
  <%elsif depth > cfg[:depth] %>
      <%
      # take care of the free fall
      (depth - cfg[:depth]).times do
      %>
        </ul>   
      <%end%>
  <%end%>
  <li> <%= cfg[:name] %></li>
  <%depth = cfg[:depth] %>
<%end%>
<%
# take care of the final free fall 
depth.times do 
%>
  </ul>
<%end%>
'node 1',:depth=>1},
{:name=>node 2',:depth=>2},
{:name=>node 3',:depth=>1},
{:name=>node 4',:depth=>1}]
%>
      cfg[:深度]]>

这个ERB模板应该可以做到这一点。将代码提取到帮助器或分部以保持整洁

<%
# lets assume that your array is an a variable
# called list
list = [ {:name => 'node 1', :depth => 1}, 
         {:name => 'node 2', :depth => 2},
         {:name => 'node 3', :depth => 1}, 
         {:name => 'node 4', :depth => 1}]

%>
<% depth = 1%>
<ul>
<%list.each do |cfg|%>
  <%if depth < cfg[:depth] %> 
    <ul>
  <%elsif depth > cfg[:depth] %>
      <%
      # take care of the free fall
      (depth - cfg[:depth]).times do
      %>
        </ul>   
      <%end%>
  <%end%>
  <li> <%= cfg[:name] %></li>
  <%depth = cfg[:depth] %>
<%end%>
<%
# take care of the final free fall 
depth.times do 
%>
  </ul>
<%end%>
'node 1',:depth=>1},
{:name=>node 2',:depth=>2},
{:name=>node 3',:depth=>1},
{:name=>node 4',:depth=>1}]
%>
      cfg[:深度]]>

看起来不错,谢谢:)不幸的是,由于我对传入数据的假设太多,所以对它的需求已经消失,它的顺序不正确,因为它没有考虑到亲子关系信息。希望这对将来的人有所帮助:)@kandaboggu:谢谢你的回答——它也帮助了我。谢谢你,这帮我节省了很多时间。我想不出一个优雅的方法来将它翻译成HAML,所以我现在只在里面使用了:erb,但它像一个符咒一样工作。看起来不错,谢谢:)不幸的是,由于我对传入的数据假设太多,它的需要已经消失了,它的顺序不正确,因为它没有考虑到亲子关系信息。希望这对将来的人有所帮助:)@kandaboggu:谢谢你的回答——它也帮助了我。谢谢你,这帮我节省了很多时间。我想不出一个优雅的方法来将它翻译成HAML,所以我现在只在它里面使用了:erb,但它就像一个符咒。