2009-10-28 63 views
2

我想這有一個非常簡單的答案對於陣列中的第一個x?

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

以我上面的簡單的例子,我將如何應用類我<li>前三個實例回來了?其次,如何才能讓第二個項目和第一個項目有不同的課程?如1..2

回答

4

要麼你可以手工計算(這是有點醜):

<% 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_method(在helpers)像class_by_position(pos),這樣你就可以寫

<li class=<%= class_by_position(i) %>> 
+0

太棒了!這是一個非常有用的功能......讓我重新思考再次使用'for in' ......哈! – 2009-10-28 03:18:19

2

第一個孩子假選擇器可能是一個更好的方法,但你需要一個計數器變量來跟蹤迭代以你的方式。

+0

至於CSS,我同意,但這只是一個簡短的例子,實際上我會做的不僅僅是造型,所以我保持簡單。 – 2009-10-28 03:05:35

+0

但是,反正有效的建議+1 – 2009-10-28 03:17:37

2

你的問題有點含糊。我不知道是否要在第一個x之後停止處理數組,或者不想。

如果你只是想在第一個x項目後停下來,或者只是尋找第二個和第三個項目,解決方案是使用一個切片。

例子:只是第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 %> 
相關問題