Как я уже сказал в комментарии к самому вашему вопросу, я являюсь автором упомянутого вами камня twilio-rb.Вдобавок ко всему, я бы использовал ресурс проверки, на который вы указали номер телефона.
POST /verifications.voice { telephone_number: '+12125551234' }
В действии создания используйте Twilio::Call.create
для создания нового вызова с Twilio
def create
@verification = Verification.new params[:verification]
if @verification.save
Twilio::Call.create to: @verification.telephone_number,
from: YOUR_CALLER_ID, url: verification_url(@verification, format: :voice)
# 201 created and return verification code etc
else
# Handle errors
end
end
Вам также может понадобиться спасти любые ошибки API, которые могут возникнуть в twilio-rb.URL ссылается на действие show экземпляра ресурса проверки.Затем Twilio наберет предоставленный телефонный номер, и при соединении вызов запросит URL-адрес, например, GET /verifications/1.voice
, поэтому вам потребуется представление шоу, которое запрашивает код подтверждения и собирает цифры с помощью <Gather>
глагол :
res.gather num_digits: 4, action: twilio_hack_verification_url(@verification, :format => :voice), method: 'POST' do |form|
form.say 'Please enter the your 4 digit verification code'
end
Поскольку Twilio в настоящее время не реализует глагол PUT, вы добавите члена в свой ресурс
resources :verifications do
member { post 'twilio_hack' }
end
Затем в контроллере обновите объектс помощью пользовательского ввода:
def twilio_hack
@verification = Verification.find(params[:id]).tap do |v|
v.user_input params['Digits']
v.save
end
if @verification.confirmed?
# handle success
else
# handle failure
end
end
Наконец, в вашей модели вам понадобится код, который генерирует код подтверждения и проверяет, подтвержден ли он
class Verification < ActiveRecord::Base
before_save -> { self[:confirmed] = true if user_input == verification_code }, if: user_input
before_create -> { self[:verification_code] = rand.to_s[2..5] }
end
Это все не проверено и отключенооколо 2 минут подумал, но это должно помочь вам начать.