2

我正在使用祖先宝石,并想将一整棵树打印到一张桌子上。我正在使用的对象是组,所以它看起来像这样。

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 约定。在视图中,我将如何输出对象/哈希?

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

4

3 回答 3

3

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

<% @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>
于 2013-08-21T23:53:41.090 回答
2

创建一个过程。这是一个递归问题。

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
于 2013-08-21T23:33:06.337 回答
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 %>

风格随心所欲。

于 2013-08-21T23:57:05.203 回答