对不起,这是一个非常基本的问题,所以应该很容易回答!
使用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,即使代码几乎与上面的代码完全相同,它连接并产生所需的结果。
有什么想法吗?感谢所有的帮助。
答案 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 %>
这应该有用。