2015-10-23 73 views
0

我目前正在使用Rails/Mapbox應用程序。我目前沒有爲我的House對象存儲地理位置,而是使用助手方法創建臨時實例變量來存儲傳遞到Mapbox的地理位置。使用enumerable#map添加實例變量返回錯誤信息

以下,all_houses參數是許多House對象的數組。

我創建了下面的helper方法:

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 

我使用的是剛創業板通過從我的控制器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]>, ...] 

我所得到的是陣列的只有geolocations陣列,例如:

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

編輯:

下面是我在我的控制器。 gon是從剛寶石

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

    gon.houses = json_houses 
end 

回答

3

當使用map,塊的最後一行是從中新陣列被構造隱式return語句。要返回修改後的房屋目標,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 
    house 
    end 
end 

編輯:您可能需要像這樣在你的控制器方法

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

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

謝謝你的回覆。我嘗試在'map'塊中返回房子,現在我們返回了一個數組中沒有'geo'屬性的所有'House'對象。 –

+0

我對'gon' gem不熟悉,但我懷疑發生了什麼,它是使用'to_json'序列化模型,這將不幸地遺漏掉那些動態添加到模型中的變量。相反,您可以使用'as_json'來指定還應該包含這個附加屬性。我用一個例子更新了答案。 –

+0

太棒了!謝謝你,該解決方案的工作原理和傳遞所有信息 –