2014-01-12 50 views
0

我想要做的是通過哈希循環並將某些鍵的值保存到數據庫。這個散列有嵌套的關鍵字,我努力尋找一種合適的方式來循環它。循環遍歷Rails控制器中的嵌套哈希

首先,我解析照片的JSON(從500px的API),並把反應到終端:

def index 
    @photos = JSON.parse(get_access_token.get('/v1/photos/search?term=california').body) 
    p @photos 
    save @photos 
end 

我在控制檯得到的迴應是一切很好,而且看起來是這樣的。 (我剪下來,所以它不會佔用太多的空間):

{ 
    "current_page": 1, 
    "total_pages": 50, 
    "total_items": 8263, 
    "photos": [ 
    { 
     "id": 4930535, 
     "name": "Bike", 
     "description": "", 
     "times_viewed": 28, 
     "rating": 27, 
     "created_at": "2012-02-10T00:39:03-05:00" 
    }, 
    { 
     "id": 4930206, 
     "name": "Rain", 
     "description": "", 
     "times_viewed": 1, 
     "rating": 59.7, 
     "created_at": "2012-02-10T00:04:09-05:00" 
    }, 
    { 
     "id": 4930202, 
     "name": "California", 
     "description": "", 
     "times_viewed": 100, 
     "rating": 58.2, 
     "created_at": "2012-02-10T00:05:25-05:00" 
    } 
    ] 
} 

我再通過photos試圖循環並保存namedescriptiontimes_viewed的分貝,使用該保存方法。

def save photos 

    photos.each do |photo| 
    p = Photo.new(:name => photo["photos"]["name"], :description => photo["photos"]["description"], :times_viewed => photo["photos"]["times_viewed"]) 
    p.save 
    end 

end 

麻煩的是,這些照片主要的嵌套,並且在終端引發此錯誤:

TypeError (no implicit conversion of String into Integer): 
    app/controllers/photos_controller.rb:18:in `[]' 
    app/controllers/photos_controller.rb:18:in `block in save' 
    app/controllers/photos_controller.rb:17:in `each' 
    app/controllers/photos_controller.rb:17:in `save' 
    app/controllers/photos_controller.rb:10:in `index' 

回答

3

只需將照片數組從您的json響應中取出並對其進行迭代即可。這樣你只有一層散列鍵可供參考:

json_response['photos'].each do |photo| 
    Photo.create name: photo['name'], description: photo['description'], 
    times_viewed: photo['times_viewed'] 
end 
+0

這樣做完美。非常感謝! – gosseti

0

photos["photos"]是一個數組,所以你需要name前指定索引。您保存方法的實現並不完全清楚,但我相信你的新方法參數的形式應該爲:

:name => photo["photos"][index]["name"] 

你得到一個轉換錯誤,因爲編譯器試圖name轉換成指數。