如何使用ruby连接到Twilio API

时间:2013-05-20 05:30:47

标签: ruby sinatra twilio

对不起,这是一个非常基本的问题,所以应该很容易回答!

使用ruby和sinatra,我试图通过api连接来获取我的电话的详细信息。 twilio规定的方式似乎是:

@client = Twilio::REST::Client.new account_sid, auth_token
# Loop over calls and print out a property for each one
@client.account.calls.list.each do |call|
puts call.sid
puts call.from
puts call.to

工作正常,并将数据“放入”终端。我想在HTML页面上打印结果,所以我更改了行

@client.account.calls.list.each do |call|

@calls = @client.account.calls.list

并删除了上面代码块的最后3行,即。所有的“推杆”

然后,尝试在我的索引页面上打印我包含以下内容:

<% @calls.each do |call| %>
 <h4 style="color: #ff0000;"><%= params['msg'] %></h4>
 <ul>
  <li> <%= call.from %> </li>
  <li> <%= call.to %> </li>
  </ul>
<% end %>

错误消息显示:

undefined method `each' for nil:NilClass

所以我似乎没有连接到twilio,即使代码几乎与上面的代码完全相同,它连接并产生所需的结果。

有什么想法吗?感谢所有的帮助。

1 个答案:

答案 0 :(得分:0)

在Sinatra中,不要使用实例变量来存储连接对象和类似的东西。使用@call方法代替set,该方法允许用户将此类对象设置为不同的变量。

根据代码,calls.list方法在Twilio::REST::ListResource模块中定义。这将返回一个数组,因此,代码的第二部分(在index.erb中)是正确的。

问题是,当你开始使用实例变量来存储连接对象时,它会在路由中重置,这就是get do .. end块内发生的事情。

将代码更改为:

set :client, Twilio::REST::Client.new(account_sid, account_pass)
# Now, this setting can be accessed by settings.client

get '/calls' do
  @calls = settings.client.account.calls
  erb :index
end

# index.erb

<% @calls.each do |call| %>
...
<% end %>

这应该有用。