4

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

使用 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,即使代码几乎与上面连接并产生所需结果的代码几乎完全相同。

有任何想法吗?感谢所有帮助。

4

1 回答 1

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 %>

这应该有效。

于 2013-06-19T15:44:57.370 回答