【问题标题】:session method cannot be called 2 times in controller会话方法不能在控制器中调用 2 次
【发布时间】:2016-03-23 18:35:36
【问题描述】:

在下面的代码中,当 #call 方法执行时,它将调用重定向到 #connect 方法以播放音频,然后 #connect 方法重定向到 #menu_selection 一切都中断了。我在 heroku 日志中得到的错误是会话为 nil 或已定义。

我不明白的是我已经在第一个方法#call 中使用了 session[:user_id]。为什么在#menu_selection 方法中没有定义?

    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

在#menu_selection 方法中出现错误:未定义的局部变量或方法“会话”

它在我定义“列表”变量的第一行。

我以前从未遇到过这种问题。如果有人知道发生了什么,我将不胜感激。

我尝试将第一个@list 变量定义为方法#call 之外的类变量,但它给了我现在得到的相同错误。我还尝试在#call 方法中将其设为类变量以尝试在#menu_selection 方法中使用它,但出现“@@list is undefined”错误。

【问题讨论】:

    标签: ruby-on-rails session ruby-on-rails-4 controller twilio


    【解决方案1】:

    这里是 Twilio 开发者宣传员。

    这里的问题是#call 操作中的会话在您的用户和服务器之间。但是,当您发起呼叫并且 Twilio 回调到您的服务器时,Twilio 和服务器之间的会话完全不同。

    在这种情况下,您需要通过您的 URL 传递您需要 Twilio 知道的数据。因此,不要仅仅发送连接 URL,而是使用稍后需要的参数发送它。因此,您的 #call 操作如下所示:

    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
    

    然后,您的 #connect 操作也需要将它们传递给您的 #menu_selection 操作(注意 menu_path 行):

    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
    

    最后,您将能够在 #menu_selection 操作中使用这些参数,而不是会话:

    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
    

    如果这有帮助,请告诉我!

    【讨论】:

    • Philnash,再次感谢您的帮助。这是你第二次为我回答问题。对此,我真的非常感激。我完全按照您的建议进行了尝试,并且成功了。 :D
    • 没问题!我只是来帮忙的:)
    • 我很感激 :) 如果接听电话的人没有接听电话,你知道我该如何挂断电话吗?或者有可能吗?因为现在是这样,如果他们不回答,它会留下语音消息。它将 mp3 录音作为消息留下。
    • 查看 Twilio 的答录机检测:twilio.com/help/faq/voice/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2016-09-26
    • 2012-09-03
    • 2023-03-24
    • 2017-09-13
    • 2018-12-15
    • 2016-07-19
    相关资源
    最近更新 更多