2013-11-27 15 views
0

我想創建一個兩列表格。我想將項目的數據放入每個'列',因此我只想在項目數量均勻時開始新行。有條件地啓動一個新表格行

所以我循環了一個項目列表,並推進了每次通過一個計數器。當計數器%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> 

那我怎麼能做到這一點?

+1

不明白你想說什麼,但嘗試做迭代與'.each_with_index',而不是在櫃檯上。 – Zippie

+0

你應該讓問題更簡潔。我不想讀它。 – sawa

+0

一個例子,你的輸入是什麼樣的,你想要什麼輸出是獲得快速答案的好方法。 –

回答

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] 
0

自從我做了haml以來已經有一段時間了,但是不應該這樣做嗎?

- items.each do |item| 
    %tr{class: "something"} 
    %td= item[:value1] 
    %td= item[:value2] 

這樣,%tr在時間自動封裝2 %td秒。