在erb中的对象数组中访问属性

时间:2014-06-06 18:37:19

标签: ruby-on-rails ruby arrays erb

我对铁轨上的红宝石很新。我有一个返回一个对象数组的方法。每个对象都有一个具有关联值的属性列表。以下是对象的示例:

#<People id: 1, name: "Person1", age: "10">

在我的控制器中,我将此对象数组作为@array返回。然后在我的.erb文件中,我有以下代码行

<% @array.each do |a| %>
  <tr><td><%= a.name %></td></tr>
<% end %>

但是当我运行我的代码时,我收到一条错误消息undefined method 'name'

我知道name属性在我的数组中,因为在我返回@array之前我raise @array[0].name并且出现了正确的名称。

非常感谢任何帮助。

编辑: 不幸的是我不能共享我的控制器或Person类,因为它是专有的,但我可以告诉你输出:

<% @array.each do |a| %>
      <tr><td><%= a %></td></tr>
    <% end %>

以上输出:

[0, #<People id: 1, name: "Person1", age: "10">]

现在阵列中只有一个对象。希望这会有所帮助。再次感谢任何帮助。

编辑2:我认为这可能与我如何向@array添加元素有关。 这就是我向@array添加元素的方式:

for idx in 0 ... @stats.size
  @array[idx] = Car.find(@stats[idx])
end

1 个答案:

答案 0 :(得分:3)

你的&#34;阵列&#34;不是一个数组,它是一个哈希映射数字到对象。您需要修复控制器,以便生成正确的数组,或使用@array.each do |index, a|正确迭代哈希。

您创建@array的行似乎很合适

@array = {} # hash

而不是这样:

@array = [] # array

我怎么知道? {0: 'blah'}.each { |a| p a }将生成[0, 'blah'],与第一次迭代生成[0, #<Person...>]的方式相同。当您使用each迭代哈希时,它会有效地将哈希从{key: value, key2: value2}哈希转换为[[key, value], [key2, value2]]嵌套数组,并将每个子数组splats到块中。由于您的块只接受一个参数,因此[key, value]数组不会被展开,并且您都会在a中传入。

这就是您通常使用hash.each { |key,value|迭代哈希的原因。