ruby-on-rails - rake 任务中的 open-uri 出现 404 错误......是什么原因造成的?

标签 ruby-on-rails ruby-on-rails-3 debugging rake open-uri

我有一个 rake 任务,它从 API 获取 JSON 数据,对其进行解析,然后将其保存到数据库中:

task :embedly => :environment do
  require 'json'
  require 'uri'
  require 'open-uri'

  Video.all.each do |video|
    json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525")
    ruby_hash = JSON.parse(json_stream.read)
    thumbnail_url = ruby_hash['thumbnail_url']
    embed_code = ruby_hash['html']
    video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code)
  end  
end

当我运行 rake 任务时,我在堆栈跟踪中收到此错误,但我不知道是什么导致了它:
rake aborted!
404 Not Found
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open'
/rubyprograms/dreamstill/lib/tasks/tasks.rake:16
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15:in `each'
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'

关于问题的任何想法以及如何解决它?

最佳答案

如果指定的资源(视频/图片)不存在,embed.ly api 将返回 404。 OpenURI 将此作为异常处理。要捕获错误,您可以执行以下操作:

task :embedly => :environment do
  require 'json'
  require 'uri'
  require 'open-uri'

  Video.all.each do |video|
    begin
      json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525")
      ruby_hash = JSON.parse(json_stream.read)
      thumbnail_url = ruby_hash['thumbnail_url']
      embed_code = ruby_hash['html']
      video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code)
    rescue OpenURI::HTTPError => ex
      puts "Handle missing video here"
    end 
  end  
end

您还可以在运行任务之前检查视频/网址是否有效。

关于ruby-on-rails - rake 任务中的 open-uri 出现 404 错误......是什么原因造成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7495244/

相关文章:

ruby-on-rails - 如何在 Rails 3 的功能测试中使用 polymorphic_path

debugging - 从协程内省(introspection) _ENV

ruby-on-rails - Mongoid 中具有 Belongs_to 关联的嵌入文档

ruby-on-rails - 带有 data-remote ="true"的链接未作为 JSON 处理

ruby-on-rails - 如何通过 ruby​​ on Rails 模型向数据库赋予 null 值

ruby-on-rails - 如何修复 "uninitialized constant SampleApp"

jquery - jQuery 的延迟加载插件与 HTML PushState() 不兼容?

node.js - 如何将参数传递给nodemon(或node-supervisor)中的可执行文件?

ruby-on-rails - 在 Ruby 上访问 Google 通讯录 API

mysql - mysql case 语句未显示在结果中时不匹配