Вид на рельсы, чтобы список пользователей в Зебра-полосатый таблица


<% i = 0 %> 
<% @patients.each do |patient| %> 
 <tr class="<%= i % 2 == 0 ? 'Even' : 'Odd' %>">
    <td><%= link_to patient.id, patient %></td>
    <td><%= patient.user.username %></td>
    <td><%= patient.user.first_name %></td>
    <td><%= patient.user.last_name %></td>
    <td><%= patient.user.email %></td>
    <td><%= patient.user.active %></td>
    <td><%= patient.user.disabled %></td>
    <td>
      <ul class="Horizlist">
        <li><%= link_to 'Detail', patient %></li>
      </ul>
    </td>
  </tr>
<% i += 1 %>    

Мне не нравится, что я должен определить переменную мне, есть ли лучший способ?



650
5
задан 24 февраля 2011 в 11:02 Источник Поделиться
Комментарии
2 ответа

В Rails есть встроенный метод, цикл, который будет цикл между двумя еще больше возможностей для вас, так что вам не придется управлять "даже"/"странный" выбор.

<% @patients.each do |patient| %>
<%= content_tag :tr, :class => cycle('Even', 'Odd') do %>
<%= content_tag :td, link_to(patient.id, patient) %>
<% [:username, :first_name, :last_name, :email, :active, :disabled].each do |property| %>
<%= content_tag :td, patient.user.send(property) %>
<% end %>
<td>
<ul class="Horizlist">
<%= content_tag :li, link_to('Detail', patient) %>
</ul>
</td>
<% end %>
<% end %>

Если вы случайно используете Haml, это выглядит довольно мило. :)

- @patients.each do |patient|
%tr{:class => cycle('Even', 'Odd')}
%td= link_to(patient.id, patient)
- [:username, :first_name, :last_name, :email, :active, :disabled].each do |property|
%td= patient.user.send(property)
%td
%ul.Horizlist
%li= link_to('Detail', patient)

11
ответ дан 25 февраля 2011 в 05:02 Источник Поделиться

В первую очередь Рубин имеет each_with_index способ, так что вы можете сделать @пациенты.each_with_index делать |пациента, я| вместо того, чтобы держать счетчик вручную.

Однако с условным внутри петли, которая по-прежнему слишком много логики для представления на мой взгляд. То, что я хотел сделать, это определить помощника для этого, который может выглядеть так:

# For each item in the given collection, yield that item and embed the
# result in the given tag. The class attribute of that tag alternates
# between class1 and class2
def alternating(collection, tag, class1, class2, html => {})
collection.each_with_index do |item, i|
html[:class] = i % 2 == 0 ? class1 : class2
content_tag(tag, html, false) do
yield item
end
end
end

И затем вызвать его, как это:

<% alternating(@patients, :tr, 'Even', 'Odd') do |patient| %> 
<td><%= link_to patient.id, patient %></td>
<td><%= patient.user.username %></td>
<td><%= patient.user.first_name %></td>
<td><%= patient.user.last_name %></td>
<td><%= patient.user.email %></td>
<td><%= patient.user.active %></td>
<td><%= patient.user.disabled %></td>
<td>
<ul class="Horizlist">
<li><%= link_to 'Detail', patient %></li>
</ul>
</td>
<% end %>

2
ответ дан 25 февраля 2011 в 12:02 Источник Поделиться