如何一次访问两个数组元素

时间:2013-03-28 03:40:30

标签: ruby ruby-on-rails-3

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

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

3 个答案:

答案 0 :(得分:2)

我倾向于使用Enumerable#each_slice

each_slice方法将您的数组转换为'slices'数组,其大小指定为第一个参数,如下所示:

(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>

答案 1 :(得分:0)

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

你超越了数组边界并尝试取消引用nilnil没有方法first_name

假设您的阵列中有两个用户,U0和U1。你的阵列现在有两个长度。

你现在正在循环遍历这个数组:

  • i = 0,然后打印U0和U1
  • i = 1,然后打印U1并尝试打印不存在的U2

答案 2 :(得分:0)

我肯定会选择TRON的解决方案。但是,在您尝试访问@users[N]

N >= @users.length时,会触发异常

例如:

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