404错误与开放铀在耙子任务...是什么原因? [英] 404 error with open-uri in a rake task... what's causing it?

查看:121
本文介绍了404错误与开放铀在耙子任务...是什么原因?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个耙子任务从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

我在堆栈跟踪中收到此错误我执行耙子任务,我不知道是什么原因造成的:

 耙子中止! 
404找不到
/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/版本/ 1.8 / usr / lib / ruby​​ / 1.8 / open-uri.rb:164:在`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'
/系统/库/框架/ Ruby.framework /版本/ 1.8 / usr / lib / ruby​​ / 1.8 / open-uri.rb:518:在`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
/ ruby​​programs / dreamstill / lib / tasks / tasks.rake:15:在`eac h'
/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`执行'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in`invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/版本/ 1.8 / usr / lib / ruby​​ / 1.8 / monitor.rb:242:在`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
放置处理视频丢失
end
end
end

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


I have a rake task that fetches JSON data from an API, parses it, and saves it to the database:

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

I get this error in the stack trace when I run the rake task and I have no idea what is causing it:

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'

Any ideas on the problem and how to resolve it?

解决方案

The embed.ly api returns a 404 if the specified resource(video/picture) doesn't exist. OpenURI handles this as an exception. To catch the error you could do something like this:

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

You could also check if the videos/urls are valid before running the task.

这篇关于404错误与开放铀在耙子任务...是什么原因?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆