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

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

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

Я провел небольшой тест с объединением 2 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'])

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

0
Rubioli 7 Дек 2018 в 15:34

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']
}

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

0
Rubioli 8 Дек 2018 в 10:28