#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