2009-10-28 64 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 %> 
相关问题