Как вы перебираете и извлекаете значения из хеша с массивами? - PullRequest
3 голосов
/ 14 февраля 2012

Я пытаюсь создать быстрый взлом, который «любит» все последние фотографии в Instagram определенного тега.

Я прошел аутентификацию и использовал гем JSON, чтобы превратить JSON из API в хэш Ruby, например:

def get_content (tag_name)

   uri = URI.parse("https://api.instagram.com/v1/tags/#{tag_name}/media/recent? access_token=#{@api_token}")

   http = Net::HTTP.new(uri.host, uri.port)
   http.use_ssl = true
   http.verify_mode = OpenSSL::SSL::VERIFY_NONE

   request = Net::HTTP::Get.new(uri.request_uri)

   json_output = http.request(request)
   @tags = JSON.parse(json_output.body)

end

Это выводит хэш с массивами в виде ключей, вложенных как исходный JSON.(напр. http://instagr.am/developer/endpoints/tags/)

Я пытаюсь перебрать и извлечь все "идентификаторы" фотографий.

Однако, когда я использую каждый метод:

@tags.each do |item| 
  puts item["id"]
end

Я получаю сообщение об ошибке:

instagram.rb:23:in `[]': can't convert String into Integer (TypeError)
from instagram.rb:23:in `block in like_content'
from instagram.rb:22:in `each'
from instagram.rb:22:in `like_content'
from instagram.rb:42:in `<main>'

1 Ответ

15 голосов
/ 14 февраля 2012

instagram.rb:23:in `[]': can't convert String into Integer (TypeError)

Вы получаете эту ошибку, потому что в puts item["id"], item является массивом, а не хешем, поэтому Ruby пытается преобразовать то, что вы помещаете между[] в целочисленный индекс, но не может, потому что это строка ("id").

Это вытекает из того факта, что json_output.body является хешем.Посмотрите еще раз на пример ответа JSON в документации:

{ "data" : [
    { "type"     : "image",
      // ...
      "id"       : "22699663",
      "location" : null
    },
    // ...
  ]
}

Вся эта структура становится единым хешем с одним ключом "data", поэтому, когда вы вызываете @tags.each, вы на самом деле звоните Hash#each, и поскольку значение "data" является массивом, когда вы вызываете item["id"], вы вызываете Array#[] с неправильным типом параметра.

Короче говоря, что вы на самом деле хотите сделатьВозможно, это так:

@tags = JSON.parse( json_output.body )[ "data" ]

.. тогда @tags будет массивом, который вы хотите вместо хеша, и вы можете перебирать его элементы так, как вы хотели:

@tags.each do |item| 
  puts item["id"]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...