我有一个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>
答案 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)
下次发布错误消息的全文。
你超越了数组边界并尝试取消引用nil
。 nil
没有方法first_name
。
假设您的阵列中有两个用户,U0和U1。你的阵列现在有两个长度。
你现在正在循环遍历这个数组:
答案 2 :(得分:0)
我肯定会选择TRON的解决方案。但是,在您尝试访问@users[N]
N >= @users.length
时,会触发异常
例如:
test = [1,2,3]
test[1] # => 2
test.length # => 3
test[3] # => not defined