#ruby-on-rails #twilio
#ruby-on-rails #twilio
Вопрос:
Я хотел бы разрешить слушателю нажимать клавишу *, чтобы запросить включение во время конференц-связи, при этом модератор может включить его / ее с консоли.
У меня есть контроллер со следующим :
def conference_connect
@room_name = flash[:room_name]
@room_id = flash[:event_id]
case params['Digits']
when "1" # listener
@muted = "true"
when "3" # moderator
@moderator = "true"
end
response = Twilio::TwiML::VoiceResponse.new
response.say(voice: 'alice', language: 'en-US', message: 'You are in, press * at anytime to ask a question')
dial = Twilio::TwiML::Dial.new(hangupOnStar: true)
dial.conference(@room_name,
wait_url: "http://twimlets.com/holdmusic?xxxxxxxamp;",
muted: @muted || "false",
start_conference_on_enter: @moderator || "false",
end_conference_on_exit: @moderator || "false",
)
gather = Twilio::TwiML::Gather.new(action: '/redirectIntoConference?name= ' @room_name, digits: 1)
response.append(dial)
end
У меня следующая ошибка :
No template found for TwilioController#conference_connect, rendering head :no_content
Я хотел бы отправить сообщение модератору (или обновить некоторые параметры), чтобы уведомить его, что у слушателя есть вопрос, который нужно задать.
Ответ №1:
Евангелист-разработчик Twilio здесь.
Здесь у вас есть пара проблем. Во-первых, ваша ошибка заключается в том, что вы не возвращаете TwiML, который вы встроили в действие вашего контроллера, и Rails вместо этого ищет шаблон.
В конце вызова действия render
вот так:
response.append(dial)
render xml: response.to_xml
end
Что касается запроса выступить *
, вы на полпути. Во-первых, <Gather>
это вам не поможет, поэтому избавьтесь от строки:
gather = Twilio::TwiML::Gather.new(action: '/redirectIntoConference?name= ' @room_name, digits: 1)
Вместо этого вы hangupOnStar
установили значение true в своем <Dial>
, это отключит пользователя от конференции (звучит плохо, но это то, что вы хотите для этого). Вам просто нужно настроить, что происходит с пользователем после того, как он вешает трубку.
В этом случае вы хотите отправить запрос модератору, а затем попросить их присоединиться к конференции. Вы делаете это с помощью action
параметра в <Dial>
, который указывает на URL, который будет запрошен, когда вызывающий абонент покинет конференцию.
В рамках этого действия вам нужно каким-то образом предупредить вашего модератора (я не уверен, как вы это планируете), а затем вернуть TwiML, чтобы ввести вызывающего абонента обратно в конференцию. Не забудьте настроить конференцию таким же образом, с помощью hangupOnStar
и action
.
В конечном итоге ваше действие должно выглядеть примерно так:
def conference_connect
@room_name = flash[:room_name]
@room_id = flash[:event_id]
case params['Digits']
when "1" # listener
@muted = "true"
when "3" # moderator
@moderator = "true"
end
response = Twilio::TwiML::VoiceResponse.new
response.say(voice: 'alice', language: 'en-US', message: 'You are in, press * at anytime to ask a question')
dial = Twilio::TwiML::Dial.new(hangupOnStar: true, action: '/redirectIntoConference?name= ' @room_name)
dial.conference(@room_name,
wait_url: "http://twimlets.com/holdmusic?xxxxxxxamp;",
muted: @muted || "false",
start_conference_on_enter: @moderator || "false",
end_conference_on_exit: @moderator || "false",
)
response.append(dial)
render xml: response.to_xml
end
Дайте мне знать, если это вообще поможет.
Комментарии:
1. Привет, Филнаш, я только что попробовал, и я получаю ошибку приложения без какого-либо обновления в моей консоли. Я не знаю, какие параметры / строка завершились ошибкой.
2. Если вы получаете сообщение об ошибке приложения, то вы должны увидеть сообщение в отладчике Twilio: twilio.com/console/runtime/debugger
3. Ок, я вижу неверный формат URL (ошибка 11100). Я сохранил URL-адрес как «dial = Twilio:: TwiML::Dial.new(hangupOnStar: true, action: ‘/ redirectIntoConference?name = ‘ @room_name)», который, похоже, является неправильным URL. строка @room_name правильно отображается в инспекторе запросов, хотя
4. Могу я спросить, как должен выглядеть правильный URL (как пример), пожалуйста
5. Возможно, вам потребуется указать URL, исключающий название комнаты (
action: "/redirectIntoConference?name=#{CGI.escape(@room_name)}"
). Кроме того, я подумал, что TwiML подходит для относительного URL, но вы могли бы попробовать отправить и полный абсолютный URL.