2016-03-23 3 views
0

aufgerufen werden. Wenn die #call -Methode ausgeführt wird, leitet sie den Aufruf an die Methode #connect um, um ein Audio abzuspielen, dann leitet die Methode #connect zu #menu_selection um, wo alles bricht . Der Fehler, den ich in den Heroku-Protokollen erhalte, ist, dass die Sitzungen null oder definiert sind.Sitzungsmethode kann nicht 2 Mal im Controller

Was ich nicht verstehe, ist, dass ich bereits session [: user_id] in der ersten Methode #call verwende. Warum ist es in der Methode #menu_selection nicht definiert?

def call 
     @list = User.find_by(id: session[:user_id]).contact_lists.find_by(id: session[:last_contact_list_id]) 
     @contacts = @list.contacts 

     @client = Twilio::REST::Client.new(@@account_sid, @@auth_token) 
     @contacts.each do |contact| 
     @call = @client.account.calls.create(
      :from => '+18056234397', # From your Twilio number 
      :to => '+1' + contact.phone ,  # To any number 

      :url => root_url + "connect" 
     ) 
     end 
     redirect_to root_path 
    end 



    def connect 
    response = Twilio::TwiML::Response.new do |r| 
     r.Play 'https://clyp.it/l1qz52x5.mp3' 
     r.Gather numDigits: '1', action: menu_path do |g| 
     g.Play 'https://a.clyp.it/2mue3ocn.mp3' 
     end 
    end 
    render :xml => response.to_xml 
end 



def menu_selection 
    list = User.find_by(id: session[:user_id]).contact_lists.find_by(id: session[:last_contact_list_id]) 
    user_selection = params[:Digits] 
    @client = Twilio::REST::Client.new(@@account_sid, @@auth_token) 
    case user_selection 
    when "1" 
    @output = "say something." 
    twiml_say(@output, true) 
    when "2" 
    twiml_dial("+1805XXXXX") 
    when "3" 
    @output = "Bye Bye..." 
    twiml_say(@output, true) 
    end 
end 

Im #menu_selection Methode erhalte ich den Fehler: nicht definiert lokale Variable oder Methode `Session

Die in der ersten Zeile, wo ich die‚Liste‘Variable bin definieren.

Ich hatte nie zuvor diese Art von Problem. Wenn jemand weiß, was los ist, würde ich Ihre Hilfe zu schätzen wissen.

Ich versuchte, die erste Variable @list als eine Klassenvariable außerhalb der Methode #call zu definieren, aber es gibt mir den gleichen Fehler, den ich jetzt bekomme. Ich habe auch versucht, es zu einer Klassenvariable innerhalb der #call-Methode zu machen, um es in #menu_selection-Methode zu verwenden, aber ich erhalte einen "@@ list is undefined" -Fehler.

Antwort

0

Twilio Entwickler Evangelist hier.

Das Problem hier ist, dass die Sitzung in der #call Aktion zwischen Ihrem Benutzer und dem Server ist. Wenn Sie jedoch einen Anruf einleiten und Twilio zu Ihrem Server zurückruft, ist die Sitzung zwischen Twilio und dem Server völlig anders.

In dieser Situation müssen Sie die Daten, die Twilio benötigt, über Ihre URL weitergeben. Anstatt also nur die Verbindungs-URL zu senden, senden Sie sie mit den Parametern, die Sie später benötigen. So Ihre #call Aktion würde wie folgt aussehen:

def call 
    @list = User.find_by(id: session[:user_id]).contact_lists.find_by(id: session[:last_contact_list_id]) 
    @contacts = @list.contacts 

    @client = Twilio::REST::Client.new(@@account_sid, @@auth_token) 
    @contacts.each do |contact| 
    @call = @client.account.calls.create(
     :from => '+18056234397', # From your Twilio number 
     :to => '+1' + contact.phone ,  # To any number 

     :url => root_url + "connect?user_id=#{session[:user_id]}&last_contact_list_id=#{session[:last_contact_list_id]}" 
    ) 
    end 
    redirect_to root_path 
end 

Dann Ihre #connect Aktion benötigen auch diejenigen auf Ihre #menu_selection Aktion zu übergeben (man beachte die menu_path Linie):

def connect 
    response = Twilio::TwiML::Response.new do |r| 
    r.Play 'https://clyp.it/l1qz52x5.mp3' 
    r.Gather numDigits: '1', action: menu_path(:user_id => params[:user_id], :last_contact_list_id => params[:last_contact_list_id] do |g| 
     g.Play 'https://a.clyp.it/2mue3ocn.mp3' 
    end 
    end 
    render :xml => response.to_xml 
end 

Schließlich werden Sie der Lage, diese Parameter zu verwenden, anstatt der Sitzung, in der #menu_selection Aktion:

def menu_selection 
    list = User.find_by(id: params[:user_id]).contact_lists.find_by(id: params[:last_contact_list_id]) 
    user_selection = params[:Digits] 
    @client = Twilio::REST::Client.new(@@account_sid, @@auth_token) 
    case user_selection 
    when "1" 
    @output = "say something." 
    twiml_say(@output, true) 
    when "2" 
    twiml_dial("+1805XXXXX") 
    when "3" 
    @output = "Bye Bye..." 
    twiml_say(@output, true) 
    end 
end 

Let me kn wenn das hilft!

+1

Philnash, nochmals vielen Dank für Ihre Hilfe. Dies ist das zweite Mal, dass Sie eine Frage für mich beantworten. Ich schätze es sehr. Ich habe genau das versucht, was Sie vorgeschlagen haben, und es hat funktioniert. : D –

+0

Kein Problem! Ich bin nur hier, um zu helfen :) – philnash

+0

Ich weiß es zu schätzen :) Weißt du, wie ich den Anruf auflegen könnte, wenn die Person, die den Anruf empfängt, nicht abholt? oder ist es möglich? Denn gerade jetzt, wie es ist, hinterlässt es eine Sprachnachricht, wenn sie nicht antworten. Es hinterlässt die mp3-Aufnahme als Nachricht. –

Verwandte Themen