我有一组数组@iterated_orders
,如下所示:
[[1, "Don", 3], [nil, nil, 4], [2, "Vri", nil]]
我的视图中的代码如下:
%table
- @iterated_orders.each do |day, day_name, order_id|
- unless day.blank?
%tr
%td.day= day
%td= order_id
我希望它输出这个html:
<tr>
<td class="day">1 Don</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td class="day">2 Vri</td>
<td></td>
<td></td>
</tr>
但是它会输出这个HTML:
<tr>
<td class="day">1 Don</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td class="day">2 Vri</td>
<td></td>
</tr>
<tr>
<td></td>
</tr>
为什么还有额外的<tr>
且<td>
并且订单号未添加到现有<tr>
?
答案 0 :(得分:1)
你的Haml实际渲染:
<table>
<tr>
<td class='day'>1</td>
</tr>
<td>3</td>
<td>4</td>
<tr>
<td class='day'>2</td>
</tr>
<td></td>
</table>
当您在浏览器中查看时,浏览器会将其更正为有效的HTML,包括添加额外的tr
元素,我怀疑这是您看到结果的位置(尽管我在Chrome中有所不同)
td
的{{1}}未添加到之前的order_id
,因为此时tr
已关闭。你的Haml读作“除非tr
为空,插入一个包含一天的单元格的新行(并关闭它),然后插入一些带有day
s的表格单元格。”
实现Haml尝试的最佳方法是首先将数据转换为与预期输出相匹配的形式。熟悉Enumerable
方法可以在这里提供帮助。特别是在这种情况下chunk_while
可能是我们想要的:
order_id
现在,您可以遍历此结构以生成HTML:
@sorted_orders = @iterated_orders.chunk_while {|before, after| after[0].blank? }
这会产生(带有您的示例数据):
%table
- @sorted_orders.each do |day|
%tr
-# the first sub-array contains the day:
%td.day #{day[0][0]} #{day[0][1]}
-# then add a td for each order_id (including the first):
- day.each do |d|
%td= d[2]
这与您的目标不完全相同(第二行中有额外的<table>
<tr>
<td class='day'>1 Don</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td class='day'>2 Vri</td>
<td></td>
</tr>
</table>
)。您可能需要更多地修复数据以获得每天相同数量的元素。