循环时意外

时间:2016-12-28 10:47:10

标签: ruby-on-rails haml

我有一组数组@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>

1 个答案:

答案 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> )。您可能需要更多地修复数据以获得每天相同数量的元素。