перебирая столбцы в рельсах - PullRequest
2 голосов
/ 15 июня 2009

Это, наверное, очень легко, но мне сложно разобраться.

У меня есть частичное:

<% for room in @scrape %>
<tr id="page_<%= room.id %>">
    <th scope="row" class="<%= cycle("spec", "specalt") -%>"><%=h room.name %></td>
    <td class="<%=current_cycle%>"><%=h room.day1 %></td>
    <td class="<%=current_cycle%>"><%=h room.day2 %></td>
    <td class="<%=current_cycle%>"><%=h room.day3 %></td>
    <td class="<%=current_cycle%>"><%=h room.day4 %></td>
    <td class="<%=current_cycle%>"><%=h room.day5 %></td>
    <td class="<%=current_cycle%>"><%=h room.day6 %></td>
    <td class="<%=current_cycle%>"><%=h room.day7 %></td>
    <td class="<%=current_cycle%>"><%= select_tag("room[#{room.id}]", options_for_select(0..room.spots,0)) %></td>

</tr>
<% end %>

Из результата find_by_sql примерно так:

    ID         Room     Day1     Day2   Day3    Day4    Day5    Day6    Day7
   18298   Blue Room   13.23    13.23   13.23   13.23   13.23   13.23   13.23

Но я не знаю, сколько будет дней, как я могу зациклить результаты столбца для разных дней?

1 Ответ

8 голосов
/ 15 июня 2009

Это можно сделать помощником, используя block / yield, но это выходит за рамки вашего вопроса. Я получу право на вопрос, сделав это в частичном.

<% room.attributes.each do |key, value| %>
  <% if key.to_s.include?("day") %>
    <td class="<%=current_cycle%>"><%=h value.to_s %></td>
  <% end %>
<% end %>

Обновление: Вот пример помощника. Если этот шаблон появляется в вашем приложении более одного раза, я думаю, что он более удобен в обслуживании и читабелен.

def attributes_for(model, match, &block)
  model.attributes.each do |key, value|
    if key.to_s.include?(match)
      # we pass key and value in this example. but you can
      # pass whatever you want to the block.
      concat(capture(key, value, &block))
    end
  end
end 

А теперь это ваш частичный:

<% attributes_for(room, "day") do |key, value| %>
  <td class="<%=current_cycle%>"><%=h value.to_s %></td>
<% end %>

Больше всего строк кода, но лучше, если вы собираетесь делать это во всем приложении.

...