Rails 5: API без неявного преобразования строки в целое число

#ruby-on-rails #typeform

#ruby-on-rails #typeform

Вопрос:

Я пытаюсь передать данные из API ответов Typeform. Все работает, за исключением ответов, сгенерированных пользователем. Работает только с одним ответом, type: website другой type: multiple_choice , например, не работает.

Пример ответа от Typeform выглядит следующим образом:

 "items": [
{
 "landing_id": XXXXXXX
},
"answers": [
        {
          "field": {
            "id": "hVONkQcnSNRj",
            "type": "website",
            "ref": "my_custom_website_reference"
          },
          "type": "url",
          "text": "https://xxxxx.com"
        },
        {
          "field": {
            "id": "k6TP9oLGgHjl",
            "type": "multiple_choice",
            "ref": "my_custom_multiple_choice2_reference"
          },
          "type": "choice",
          "choice": {
            "label": "Tokyo"
          }
        }
      ]
  

Мой OrdersController.rb

 response = HTTParty.get("https://api.typeform.com/forms/XXXXXX/responses?page_size=25amp;query=#{current_user.hash_id}",
  headers: {"Authorization" => "Bearer #{@token}"})
if response.code.to_i == 200
  items = response.parsed_response["items"]
  items.each do |item|
    @order = current_user.orders.find_or_create_by(landing_id: item["landing_id"]) do |order|
      item["answers"].each do |answer|
      order.landing_id = item["landing_id"]
      order.email = item["hidden"]["email"]
      order.price = item["hidden"]["price"]
      order.moduls = item["hidden"]["moduls"]
      order.project = item["hidden"]["project"]
# This is working
      order.website = answer["url"]
# This isn't working
      order.payment = answer["choice"]
    end
  end
end
  

Когда я меняю answer["choice"] на answer , я получаю только первый field из ànswers , который является https://xxxxx.com . Если я изменю answer["choice"] на item["answers] , я получу все field из answers .

Если я использую item["answers]["field"]["choice"] или что-то подобное, я получаю эту ошибку no implicit conversion of string into integer .

Я нашел следующее в документации Typeform:

ПОЛЕ СО ЗНАЧЕНИЕМ ОТВЕТА (ОТНОСИТЕЛЬНО ОБЪЕКТА ЭЛЕМЕНТА ОТВЕТА)

 answers[n].choice.label
  

Возможно, мне нужно скорректировать свой код? Для меня действительно неясно, что это значит.

Ответ №1:

Я не уверен, как answer['url'] работает, поскольку в ответах нет ключа «url».

Звучит так, как будто вы хотите что-то вроде…

 @order = current_user.orders.find_or_create_by(landing_id: item["landing_id"]) do |order|
  order.landing_id = item["landing_id"]
  order.email = item["hidden"]["email"]
  order.price = item["hidden"]["price"]
  order.moduls = item["hidden"]["moduls"]
  order.project = item["hidden"]["project"]

  website_field = item['answers'].select{|k,v| v['field']['type'] == 'website'}.first
  # you have an array of fields, select the first with type "website"
  order.website = website_field['text'] # now get the "text" value which is the url

  choice_field = item['answers'].select{|k,v| v['field']['type'] == 'multiple_choice'}.first
  # same but with the field with type "multiple_choice"
  order.payment = choice_field['choice']['label']
end