Почему HAML (в Ruby of Rails) не может дополнительно вывести <tr>и просто вывести <td>? - PullRequest
3 голосов
/ 15 апреля 2011

Следующий код предназначен для вывода таблицы из 2 столбцов - для вывода <tr> только каждые 2 элемента; в противном случае, просто <td>, но я обнаружил, что выход имеет <tr> все время, для каждого <td>, почему это - это ошибка?

- arr = [2, 4, 6, 8, 10, 12]
%table
  - arr.each_with_index do |num, i|
    - if i % 2 == 0
      %tr
        %td= "column 1: #{num}"
    - else
      %td= "column 2: #{num}"

Ответы [ 2 ]

7 голосов
/ 15 апреля 2011

Вы также можете использовать each_slice вместо each_with_index.each_slice (2) разбивает исходный массив на 3 группы по 2 массива, чтобы было проще выполнять итерации с помощью haml.Код меньше, чем прикосновение.

- arr = [2, 4, 6, 8, 10, 12]

%table
  - arr.each_slice(2).each do |row|
    %tr
      %td= "column 1: #{row[0]}"
      %td= "column 2: #{row[1]}"
3 голосов
/ 15 апреля 2011

На самом деле, если вы напишите это так:

- arr = [2, 4, 6, 8, 10, 12]
%table
  - arr.each_with_index do |num, i|
    - if i % 2 == 0
      %tr
        %td= "ODD row #{i}/#{i % 2} - column 1: #{num}"
    - else
      %td= "EVEN row #{i}/#{i % 2} - column 2: #{num}"

Вы увидите, что код выполнен правильно. Но HAML автоматически закрывает тег <TR> (закрытие происходит автоматически с отступом). И точно так же, HAML автоматически добавляет забытый тег <TR> для висящего <TD>.

Итак, один из возможных способов решить это:

- arr = [2, 4, 6, 8, 10, 12]
%table
  - arr.each_with_index do |num, i|
    - if i % 2 == 0
      %tr
        %td= "column 1: #{num}"
        %td
          -if arr.size > i+1
            = "column 2: #{arr[i+1]}"

Надеюсь, это поможет.

[РЕДАКТИРОВАТЬ: добавлен пример erb]

В erb вы можете сделать это немного лучше (но я обычно не люблю его использовать):

<% arr = [2, 4, 6, 8, 10, 12] %>
<table>
  <%= arr.each_with_index do |num, i| %>
    <% if i % 2 == 0 %>
      <tr><td><%= "column 1: #{num}" %></td>
    <% else %>
      <td><%= "column 2: #{num}" %></td></tr>
    <% end %>
  <% end %>
</table>
...