我已经获得了一系列电影,并且我试图抓住TheMovieDatabase.org(TMDB)来返回每个电影的ID(只是一个例子,我打算检索更多信息,但我的代码在这一点上失败了。)
我正在使用gem themoviedb(https://github.com/ahmetabdi/themoviedb),我已经获得了一系列IMDB电影ID(大约10,000部电影),我正在迭代并执行对每个API进行API调用,如下所示:
imdb_id = ["tt0114709", "tt0113497", "tt0107050", "tt0114885", "tt0113041", "tt0113277" (etc...)]
imdb_id.each do |id|
result = Tmdb::Find.imdb_id(id)
p result['movie_results'][0]["id"]
end
但是,经过多次迭代后,代码失败并出现此错误:
`block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)
有时它会在第40个ID(最常见),第88个ID或第109个ID上失败。这些ID和在数组中成功的任何其他ID之间没有什么不同,如果我单独查询它,它可以正常工作:
result = Tmdb::Find.imdb_id(imdb_id[41])
p result['movie_results'][0]["id"]
Tmdb::Find.imdb_id(imdb_id[41])
的JSON结果如下所示(我删除了一些我不会因可读性而使用的数据):
{
"movie_results" => [
{
"adult" =>false,
"id" =>11443
}
]
}
我真的很困惑导致问题的是什么。我应该在API调用之间有一些延迟吗?这甚至是在Ruby中执行大量API调用的最佳方法吗?
修改
在JSON中发现此错误:"status_message"=>"Your request count (41) is over the allowed limit of 40."}
。我需要在我的代码中实现一个限制......
答案 0 :(得分:1)
当您通过多个级别访问某个属性时,假设它们都存在,并且当它们不存在时将会出错。这个片段,例如:
result['movie_results'][0]["id"]
如果result['movie_results']
不是一个数组,或者它是一个数组但是是空的,或者是一个Hash以外的东西,那么它将会爆炸并出现异常。
更安全的方法是:
result['movie_results'] && result['movie_results'][0] && result['movie_results'][0]["id"]
经常这样做非常烦人,所以你可能想要编写一个仔细digs down的方法来寻找你正在寻找的价值。