Для первого х в массиве? - PullRequest
2 голосов
/ 28 октября 2009

Я думаю, что это довольно простой ответ

<% for user in @users %>
  <li>
    <%= link_to user.username, user %>
  </li>
<% end %>

Если взять мой простой пример выше, как бы я применил класс к моим <li> к первым трем возвращенным экземплярам?

Во-вторых, как я мог получить, чтобы вторые два предмета имели класс, отличный от первого? как в 1..2

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

Либо вы можете посчитать вручную (что довольно уродливо):

<% i = 0 %>
<% for user in @users %>
  <li class=<%= (i < 3 ? "foo" : "bar") %>>
    <%= link_to user.username, user %>
  </li>
  <% i = i.next %>
<% end %>

или используйте each_with_index

<% @users.each_with_index do |user, i| %>
  <li class=<%= (i < 3 ? "foo" : "bar") %>>
    <%= link_to user.username, user %>
  </li>
<% end %>

Как только вы доберетесь до более сложных вещей, чем i < 3 (например, проблема 1..2), вам следует подумать о helper_methodhelpers), например class_by_position(pos), чтобы вы могли написать

<li class=<%= class_by_position(i) %>>
2 голосов
/ 28 октября 2009

Ваш вопрос немного расплывчатый. Я не могу сказать, хотите ли вы прекратить обработку массива после первого x или нет.

Если вы просто хотите остановиться после первых x элементов или просто ищете 2-й и 3-й элементы, решение состоит в том, чтобы использовать срез.

Пример: только первые 3:

@user[0,3].each do |user|
  ... # only executed for user = @user[0],user = @user[1] and user = @user[3]
end

Пример: только второй и третий:

@user[1,2].each do |user|
  ... #only only executed for user = @user[1] and user = @user[3]
end

А вот более конкретный ответ на ваш вопрос с использованием этих новых концепций и content_tag , чтобы программно определить класс элемента списка. Если вы собираетесь делать это часто, это отличный кандидат на роль.

<% first = true %>
<% @user[0,2].each do |user| %>
  <% content_tag :li, 
     :class => first ? "class-for-first-item" : "class-for-2nd-&-3rd" do %>
    <%= link_to user.username, user %>
  <% end %>
  <% first = false %>
<% end %>
<!-- Now to do the rest of them:-->
<% @user[3,-1].each do |user| %>
  <% content_tag :li, :class => "class-for-rest" do %>
    <%= link_to user.username, user %>
  <% end %>
<% end %>
2 голосов
/ 28 октября 2009

Псевдоселектор: first-child может быть лучшим способом, но вам понадобится переменная-счетчик, которая отслеживает итерации, чтобы сделать это по-своему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...