我正在使用祖先宝石,并希望将整棵树打印到表格中。我正在使用的对象是组,所以它看起来像这样。
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对象本身。
答案 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 %>
根据需要设计风格。