2013-03-28 27 views
0

我有一个User对象数组:@users = User.all。现在我想用这样的东西填充两列表。但下面的代码不起作用。它告诉我first_name是一个未定义的方法。 (我也不知道如何跳过迭代):如何一次访问两个数组元素

<table class="member_table"> 
    <% for i in [email protected] %> 
    <tr> 
     <td><%= @users[i].first_name %></td> 
     <td><%= @users[i+1].first_name %></td> 
    </tr> 
    <% skip one iteration %> 
    <% end %> 
</table> 

回答

2

我倾向于使用Enumerable#each_slice

each_slice方法将您的阵列分成“片”,其中指定作为第一个参数,像这样大小的阵列:

(0...10).each_slice(2).to_a 
=> [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]] 

使用您例如,你最终用:

<table class="member_table"> 
    <% @users.each_slice(2) do |first_user, second_user| %> 
    <tr> 
     <td><%= first_user.first_name %></td> 
     <td><%= second_user.first_name unless second_user.nil? %></td> 
    </tr> 
    <% end %> 
</table> 
+2

'@ users.each_slice(2)do | first,second |'解开元素对〜 – 2013-03-28 04:14:27

+0

完全。在那里代表我的傻乎乎的监督。还会在输出的第二位添加一个条件,以防集合中有奇数个用户。 – theTRON 2013-03-28 04:49:22

+1

+1,用于推荐使用除'for'循环外的其他内容。 – 2013-03-28 04:59:50

0

下一次,发布错误消息的全文。

您将超出数组范围并尝试取消引用nilnil没有方法first_name

假设你的数组中有两个用户U0和U1。你的数组现在有两个长度。

你现在遍历数组:

  • I = 0,并打印U0和U1
  • I = 1,则在打印U1和尝试,并打印U2,这不存在
+0

而对于打算越过数组的到底是什么修复:但是你的情况,当您尝试接取@users[N]其中N >= @users.length

例如异常被触发?这很好,可以说明为什么'for'不是惯用的Ruby。 – 2013-03-28 04:57:50

0

我肯定会用TRON的解决方案。

test = [1,2,3] 
test[1]  # => 2 
test.length # => 3 
test[3]  # => not defined