2016-12-28 6 views
0

У меня есть массив массивов @iterated_orders, как это:Неожиданное <tr> когда зацикливание

[[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> с order_id не добавляется к существующему <tr>?

+1

Правильно отредактируйте фрагмент haml, так как haml работает с отступом, мы не сможем помочь, если неясно. –

+0

Где вы выводите 'day_name', это не в цикле. – Iceman

+0

'day_name' будет прикрепляться к' day' в том же '', но для проблемы это не важно – John

ответ

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 с order_id s не добавлены к предыдущим tr, потому что tr был закрыт в этой точке. Ваш Haml читает как «если только day пуст, вставьте новую строку, содержащую ячейку с днем ​​(и закройте ее), а затем вставьте некоторые ячейки таблицы с помощью order_id s».

Лучший способ достичь того, что вы пытаетесь сделать с Haml, - это сначала получить ваши данные в форме, соответствующей вашему предполагаемому результату. Быть знакомым с методами Enumerable может помочь здесь. В частности, в этом случае chunk_while, вероятно, что мы хотим:

@sorted_orders = @iterated_orders.chunk_while {|before, after| after[0].blank? } 

Теперь вы можете перебрать эту структуру, чтобы произвести HTML:

%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> 

Это не совсем то, что у вас есть (у вас есть дополнительный td во втором ряду). Возможно, вам придется немного исправить данные, чтобы получить равное количество элементов за каждый день.

+0

Спасибо! Я всегда забываю о неявном закрывающем теге! – John

 Смежные вопросы

  • Нет связанных вопросов^_^