Проблемы при попытке вернуть несколько результатов JSON с помощью Rails API / front-end - PullRequest
0 голосов
/ 21 мая 2018

У меня есть API с некоммерческой информацией, из которой я пытаюсь получить результаты, основываясь на параметре "category".По сути, я хочу просмотреть и вернуть имена, описания, адреса, номера телефонов и веб-сайты каждой некоммерческой организации в этой категории.Я продолжаю получать сообщения об ошибках «неявного преобразования строки в целое число» или «неопределенный метод []» с подходами, которые я использовал.Помощь будет принята с благодарностью!

Контроллер:

def index
   @homeless_organizations = Organization.get_homeless_organizations
end

Сервис

class Organization
  def self.get_homeless_organizations
   response = JSON.parse(RestClient.get('http://localhost:3001/organizations? 
   category=Homelessness'))
     response['name']['description']['address']['phone']['website'].each do   
     |response|
       puts response
       puts "#{response['name']['description']['address']['phone'] 
        ['website']}"
    end
  end

JSON тело:

[
 {
    "id": 1,
    "name": "Transition Projects",
    "category": "Homelessness",
    "description": "Transition Projects delivers life-saving and life-changing assistance to some of Portland’s most vulnerable residents. Whether by helping a homeless veteran and her family find housing, sheltering hundreds of people each night with nowhere else to turn, or opening new pathways to employment, Transition Projects represents an invaluable part of Portland’s social fabric.",
    "address": "665 NW Hoyt St, Portland, OR 97209",
    "phone": "(503) 280-4700",
    "created_at": "2018-05-19T00:18:30.592Z",
    "updated_at": "2018-05-19T00:18:30.592Z",
    "website": "https://www.tprojects.org/"
 },
 {
    "id": 2,
    "name": "Portland Homeless Family Solutions",
    "category": "Homelessness",
    "description": "Giving hope to homeless families with children. Our mission is to empower homeless families with children to get back into housing - and stay there.",
    "address": "1221 SW Yamhill St #210, Portland, OR 97205",
    "phone": "(503) 915-8306",
    "created_at": "2018-05-19T00:18:30.600Z",
    "updated_at": "2018-05-19T00:18:30.600Z",
    "website": "http://pdxhfs.org/"
 },
 {
    "id": 3,
    "name": "Portland Rescue Mission",
    "category": "Homelessness",
    "description": "Food, shelter, clothing, mail service, restrooms, showers and other emergency services are available free of charge at Portland Rescue Mission's Burnside Shelter.",
    "address": "111 W Burnside St, Portland, OR 97209",
    "phone": "(503) 906-7690",
    "created_at": "2018-05-19T00:18:30.603Z",
    "updated_at": "2018-05-19T00:18:30.603Z",
    "website": "https://www.portlandrescuemission.org/.../food-shelter-services/"
 }
]

1 Ответ

0 голосов
/ 21 мая 2018

Как только вы проанализируете ответ 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), либо на другой строке.

...