Adding an instance variable using enumerable#map returns 错误信息

Adding an instance variable using enumerable#map returns wrong information

我目前正在开发 Rails/Mapbox 应用程序。我目前没有为我的 House 对象存储地理位置,而是使用辅助方法创建一个临时实例变量来存储要传递给 Mapbox 的地理位置。

下面,all_houses 参数是许多 House 个对象的数组。

我创建了以下辅助方法:

def add_geolocation(all_houses)
  all_houses.map do |house|
    house_geo = find_geolocation(house.address)

    class << house
      attr_accessor :geo
    end

    house.geo = house_geo
  end
end

我正在使用 Gon Gem 将此信息从我的控制器传递到 Mapbox。返回的是一组数组,其中仅存储了每个房屋的地理位置。我想要做的是传递为每个 House 对象存储的每个实例变量,并传递其地理位置。

此外,补充一下,我也尝试了 Ruby 方法 Object#set_instance_variable,我得到了相同的结果。

我想要的:

[<House:0x007fe5670d9cc0 @a="a", @b="b", @geo=[10, 10]>, <House:0x007fe5670d9cc0 @a="a", @b="b", @geo=[10, 11]>, <House:0x007fe5670d9cc0 @a="a", @b="b", @geo=[12, -12]>, ...]

我得到的是一个只有地理位置的数组数组,例如:

[[10, 10], [10, 11], [12, -12] ...]

编辑:

以下是我的控制器中的内容。 gon 来自坤 Gem

def index
  @houses = House.all
  json_houses = add_geolocation(House.all)

  gon.houses = json_houses
end

当使用 map 时,块的最后一行是构造新数组的隐式 return 语句。要 return 修改的房屋对象,house 需要是 return

def add_geolocation(all_houses)
  all_houses.map do |house|
    house_geo = find_geolocation(house.address)

    class << house
      attr_accessor :geo
    end

    house.geo = house_geo
    house
  end
end

编辑:您的控制器方法中可能需要这样的东西

def index
  @houses = House.all
  json_houses = add_geolocation(House.all)

  gon.houses = json_houses.as_json(methods: %i(geo))
end