2017-04-18 48 views
0

我想创建一个ruby脚本,它将从文本文件中获取条形码,在web服务中搜索该条形码并下载结果。不能'file.open.read'在一个红宝石if-block中的URL

首先我试图测试web服务下载。在一个文件,当我硬编码的查询工作正常:

result_download = open('http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]').read 

这一切工作正常。

当我尝试从文本文件中取出条形码并运行查询时遇到问题。

IO.foreach(filename) {|barcode| barcode 

website = "'http://webservice.org/api/?query=barcode:"+barcode.to_str.chomp + "', 'User-Agent' => 'UserAgent [email protected]'" 

website = website.to_s 



mb_metadata = open(website).read 
} 

这样做的结果是:

/home/user/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:37:in `initialize': No such file or directory @ rb_sysopen - http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]' (Errno::ENOENT) 

我想不通,如果发生此问题,因为我产生莫名其妙的字符串不是一个有效的URL和红宝石试图打开一个非存在的文件,或者是我在for循环中执行所有这些操作并且文件/ url不存在的问题。我曾尝试使用open(website).write而不是open(website).read,但是这会产生相同的错误。

任何帮助将不胜感激。

回答

2

您明确指出的错误消息表明没有这样的文件: http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]'

您尝试将所有参数传递给使用1个大字符串(website)的open方法,这是错误的。你应该这样做。

IO.foreach(filename) do |barcode| 
    website = "http://webservice.org/api/?query=barcode:#{barcode.to_str.chomp}" 
    mb_metadata = open(website, 'User-Agent' => 'UserAgent [email protected]').read 
end 
+0

太棒了。非常感谢你的帮助。 我不是很有经验,并且专注于让每个元素都正确。我甚至没有想过要以优雅的风格去做。 再次感谢。 – Jack