我正在尝试创建一个两列表。我想将一个项目的数据放入每个“列”中,因此我只想在项目数量均匀时开始一个新行。
所以我循环浏览一个项目列表,并在每次传递时推进计数器。当计数器%2 == 0时,我想开始一个新行(%tr)。
- items.each do |item|
- if counter % 2 == 0
%tr{class: "something"}
%td= item[:value1]
%td= item[:value2]
- else
%td= item[:value1]
%td= item[:value2]
- counter += 1
这几乎产生了预期的效果。我理解为什么第一个tr被创建,因为后续的td标签处于相同的标签深度。但是如果我将它们移动到相同的深度,那么只有前两个td标签被包装到第一行中,并且后续的tds被放入一个新行(可能是由浏览器)。将所有td标记缩进到同一级别,在if子句的两侧将导致HAML崩溃(不返回任何内容)。
<tr class="something"></tr>
<tr><td>1</td>
<td>2</td>
<td>3</td>
<td>4>/td>
</tr>
我怎么能做到这一点?
答案 0 :(得分:0)
自从我做完haml已经有一段时间了,但不应该这样做吗?
- items.each do |item|
%tr{class: "something"}
%td= item[:value1]
%td= item[:value2]
这样%tr
一次会自动封装两个%td
。
答案 1 :(得分:0)
您可以使用Enumerable#each_slice
:
- items.each_slice(2) do |sliced_items|
%tr{class: "something"}
- sliced_items.each do |item|
%td= item[:value1]
%td= item[:value2]