没有理由不能在视图中使用循环,而这正是您想要的方式:
<% @groups.each do |group| %>
<!-- Render stuff -->
<% group.groups.each do |child| %>
<!-- Render child stuff -->
<% end %>
<% end %>
如果您使用 partials 来代替,管理起来可能会容易得多:
# view.html.erb
<% render partial: 'group', collection: @groups, as: :group %>
# _group.html.erb
<!-- Render stuff -->
<% render partial: 'first_child', collection: group.groups, as: :group %>
查看Rails 指南中有关布局和渲染的渲染集合部分,了解更多信息。
编辑:如果您需要处理未知级别的嵌套,partials 也可以在这里工作。如果需要,您甚至可以跟踪深度。假设您想使用嵌套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>