Ruby on Rails - объедините несколько JSON из вызова API

В моем приложении мне нужно сделать API-вызов клиенту, чтобы получить информацию о продукте (я делаю это, передавая product_id).

Их API позволяет использовать только 1 ID за раз, что во много раз усложняет работу.

Имеется в виду запустить API-вызов несколько раз и добавить результаты в представление.

Я провел небольшой тест с объединением двух JSON вместе, и все прошло нормально. Пример:

@products = data_1['data'] + data_2['data']

Конечно, это было просто и вручную. Я думал, что могу сделать для них each do и запустить код, как показано ниже:

### CONTROLLER
product_id = Array(params[:product_id].split(','))
product_id.each do |id|
    uri = URI.parse("https://website.com/api?product_id=#{id}")

    request = Net::HTTP::Get.new(uri)
    request["Accept"] = "application/json"

    req_options = { use_ssl: uri.scheme == "https", }
    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    data = JSON.parse(response.body)

    @products = data['data']
end


### VIEW
- @products.each do |product|
  %p= product.name
  %p= product.date

Это не дает мне никаких ошибок, но, на мой взгляд, я вижу подробности только для последнего product_id param. То же самое, если я уберу @products = data['data'] из each do.

В отчаянной попытке я тоже попробовал это, но безуспешно:

@products = id.as_json.merge(data['data'])

Любая помощь приветствуется!

Разве здесь не ваш код всегда имеет приоритет над продуктами? data = JSON.parse (response.body) products = data ['данные']

Ricardo Jacas 07.12.2018 14:09

@RicardoJacas Спасибо. Да, похоже, он отменяет их все и выбирает только последний

Rubioli 07.12.2018 14:14
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
328
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ был намного ближе к тому, что я имел в виду. Мне нужно запустить map на самом variable, как показано ниже:

### CONTROLLER
product_id = Array(params[:product_id].split(','))

@products = product_id.map { |id|
  request = Net::HTTP::Get.new(uri)
  request["Accept"] = "application/json"

  req_options = { use_ssl: uri.scheme == "https", }
  response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
    http.request(request)
  end
  data = JSON.parse(response.body)
  data['data']
}

надеюсь, это кому-то поможет :)

Другие вопросы по теме