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

use*_*149 0 ruby arrays ruby-on-rails erb

我对 ruby​​ on Rails 还很陌生。我有一个返回对象数组的方法。每个对象都有一个具有关联值的属性列表。下面是一个对象的示例:

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

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

<% @array.each do |a| %>
  <tr><td><%= a.name %></td></tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助将不胜感激。

编辑:不幸的是,我无法共享我的控制器或 Person 类,因为它是专有的,但我可以向您展示以下输出:

<% @array.each do |a| %>
      <tr><td><%= a %></td></tr>
    <% end %>
Run Code Online (Sandbox Code Playgroud)

以上输出:

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

目前数组中只有 1 个对象。希望这有帮助。再次,任何帮助将不胜感激。

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

for idx in 0 ... @stats.size
  @array[idx] = Car.find(@stats[idx])
end
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 5

您的“数组”不是数组,而是将数字映射到对象的哈希。您需要修复控制器,以便它生成正确的数组,或者使用 正确迭代哈希@array.each do |index, a|

您创建的行很可能@array如下所示

@array = {} # hash
Run Code Online (Sandbox Code Playgroud)

而不是像这样:

@array = [] # array
Run Code Online (Sandbox Code Playgroud)

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

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