0

我有一组用户对象:@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>
4

3 回答 3

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>
于 2013-03-28T03:52:46.970 回答
0

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

您将超出数组范围并尝试取消引用nil. nil没有办法first_name

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

您现在正在循环这个数组:

  • i = 0,然后打印 U0 和 U1
  • i = 1,然后打印 U1 并尝试打印不存在的 U2
于 2013-03-28T03:46:09.310 回答
0

我肯定会选择 theTRON 的解决方案。但是,在您的情况下,当您尝试访问@users[N]where时会触发异常N >= @users.length

例如 :

test = [1,2,3]
test[1]     # => 2
test.length # => 3
test[3]     # => not defined 
于 2013-03-28T10:01:35.837 回答