如何在Rails视图中循环并打印多维数组?

时间:2013-08-21 23:26:47

标签: ruby-on-rails ruby arrays loops view

我正在使用祖先宝石,并希望将整棵树打印到表格中。我正在使用的对象是组,所以它看起来像这样。

Group A
|__ Group A 1
    |__ Group A 1 A
|__ Group A 2
    |__ Group A 2 A
    |__ Group A 2 B
Group B
Group C
|__ Group C 1

通常,我会创建一个方法并在循环中调用自身,但这似乎打破了MVC约定。在视图中,我将如何输出object / hash?

注意:Ancestry有一个将ActiveModel组转换为哈希的方法,因此这是一个选项而不是遍历ActiveModel对象本身。

3 个答案:

答案 0 :(得分:3)

没有理由你不能在视图中使用循环,而这正是你想要的方式:

<% @groups.each do |group| %>
  <!-- Render stuff -->
  <% group.groups.each do |child| %>
    <!-- Render child stuff -->
  <% end %>
<% end %>

如果你使用局部代替这样做,可能会更容易管理:

# view.html.erb
<% render partial: 'group', collection: @groups, as: :group %>

# _group.html.erb
<!-- Render stuff -->
<% render partial: 'first_child', collection: group.groups, as: :group %>

查看Rendering Collections上Rails指南的Layouts and Rendering部分,了解更多信息。


编辑:如果你需要处理未知级别的嵌套,部分也可以在这里工作。如果需要,您甚至可以跟踪深度。假设您想使用嵌套的ul元素显示它们:

# _group.html.erb
<% content_tag :li, class: "depth-#{depth}" do %>
  <!-- Any output needed for the group itself -->
  <% unless group.group.empty? %>
    <ul>
      <%= render partial "group", collection: group.groups, as: :group,
              locals: { depth: depth+1 } %>
    </ul>
  <% end %>
<% end %>

# In your view file
<ul>
  <% render partial "group", collection: @groups, as: :group,
         locals: { depth: 0 } %>
</ul>

答案 1 :(得分:2)

创建一个proc。这是一个递归问题。

array_printer = Proc.new do |set| 
  set.map {|elem| (elem.is_a? Array) ? array_printer(elem) : "<td>#{elem}</td>" }
end

puts array_printer master_set

答案 2 :(得分:1)

我只是写一个帮手来做。

def render_tree(groups)
  content_tag(:ul) do
    groups.map do |group|
      content_tag(:li) do
        content_tag(:div, group.name, class: "groupname") +
        render_tree(group.children)
      end
    end.join
  end
end

然后在你看来:

<%= render_tree @your_tree %>

根据需要设计风格。