Как только вы проанализируете ответ JSON, вы получите массив хэшей.Чтобы получить значения из всех хэшей, вам нужно пройти через этот массив и вызвать метод Hash#[]
для каждого из хэшей для каждого из желаемых значений.
response.each do |organization|
p [organizations['name'], organization['description']]
end
Поскольку вам нужно несколько значений из хеша, вместо того, чтобы вызывать их по одному (как это было сделано выше), вы можете использовать Hash#values_at
, чтобы сделать нечто похожее на то, что вы пыталисьи вывести все значения сразу, в новом массиве:
response.each do |organization|
p organization.values_at('name', 'description')
end
Что не так с вашим кодом:
Вызов response['name']
вызывает Array#[]
, который отличается от Hash#[]
, он ожидает целочисленный индекс, для которого вы хотите получить доступ к элементу, поэтому, если вы хотите получить значения только от первой организации, которую вы могли бы сделать:
p [response[0]['name'], response[0]['description']]
Но вы передали ему строку, чего он не ожидал, поэтому вы получили это TypeError (no implicit conversion of String into Integer)
.(Это просто иллюстрация, использование each
лучше, чем передача определенных индексов, если только вам не нужны только конкретные индексы.)
Наконец, когда вы продолжаете звонить #[]
один за другим, как вы делаетезатем, после первого, вы в конечном итоге вызовете #[]
на возвращаемом значении предыдущего вызова.В этом случае, если бы вы вызывали #[]
для хэша в массиве, а не для самого массива, вы бы в итоге вызвали String#[]
, который отличается от Array#[]
и Hash#[]
.Хотя он может принимать строку или целое число, он не будет делать то, что вы хотите (если задана строка, он возвращает эту строку, если она существует в строке, для которой вы вызываете #[]
; если задано целое число, он возвращаетсимвол в этой позиции в строке):
# "Transition Projects" is `response[0]['name']`
"Transition Projects"['description'] # => nil
"Transition Projects"['Proj'] # => "Proj"
"Transition Projects"[8] # => "o"
, и тогда вы в конечном итоге либо наберете #[]
на nil
(NoMethodError
), либо на другой строке.