HAML迭代集合 - 如何将子元素组包装在唯一父元素中?

时间:2014-07-07 17:53:09

标签: html ruby haml

我有一个ActiveRecord集合,它由许多元素组成,每个元素都有不同的type,(简化的名称/变量)例如(如果它被转换为serializable_hash):

[
  {"id" => 1, "type" => "book", "title" => "title one"},
  {"id" => 2, "type" => "book", "title" => "title two"},
  {"id" => 3, "type" => "book", "title" => "title three"},
  {"id" => 4, "type" => "movie", "title" => "title four"},
  {"id" => 5, "type" => "movie", "title" => "title five"},
  {"id" => 6, "type" => "movie", "title" => "title six"}
]

我想输出以下内容:

<h2>Book</h2>
<ul class="list-book">
  <li>title one</li>
  <li>title one</li>
  <li>title one</li>
</ul> 

<h2>Movie</h2>
<ul class="list-movie">
  <li>title three</li>
  <li>title four</li>
  <li>title five</li>
</ul>

我对如何使用HAML实现此输出感到有点困惑?到目前为止,我已经开始了以下几点:

- current_type = ""

- foo.each do |bar|
  - if current_type != bar.type
    %h2= bar.type

然后当我试着考虑如何将每组项目包装在他们自己的<ul>父母中时,我的困惑就开始了。

由于其嵌套语法,我发现自己在HAML模板中对逻辑感到相当困难,这使我相信它确实不是实现这种逻辑的正确位置,所以也许如果我是&#39 ; H希望在HAML中是不可能的,是否有一个Ruby方法从散列中提取唯一的type作为数组,而是通过type迭代集合?

1 个答案:

答案 0 :(得分:2)

在将数据写入HTML之前,尝试考虑组织数据。在这种情况下,您可以先在集合上使用group_by,然后依次遍历每个数组,例如:

- foo.group_by {|m| m['type']}.each do |type, array|
  %h2= type.capitalize
  %ul{:class => "list-#{type}"}
    -array.each do |m|
      %li= m['title']

(我刚刚使用capitalize来创建标题,根据您的需要,您可能需要更复杂的内容。)