我有一个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
迭代集合?
答案 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
来创建标题,根据您的需要,您可能需要更复杂的内容。)