会话方法在控制器中不能被调用2次

时间:2016-03-23 00:10:08

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

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

我不明白的是,我已经在第一个方法#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方法中,我得到错误:未定义的局部变量或方法`session'

它位于我定义"列表"的第一行。变量

我之前从未遇到过这类问题。如果有人知道最新情况,我将非常感谢您的帮助。

我尝试将第一个@list变量定义为方法#call之外的类变量,但它给了我与现在相同的错误。我也尝试在#call方法中使它成为一个类变量,尝试在#menu_selection方法中使用它,但我得到一个" @@ list未定义"错误。

1 个答案:

答案 0 :(得分:0)

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

请告诉我这是否有帮助!