2011-06-04 34 views
3

我用下面的片段在Rails应用程序:未定义的方法“路径”对于StringIO的在Ruby中

require 'open-uri' 
url = "http://..." 
uri = URI.parse(self.url) 
file = open(uri) 
puts "path: #{file.path}" 

上的一些文件其中一期工程从网络,那么别人与崩溃:

未定义#<方法'路径” StringIO的:0x00000102a47240>

任何方式来解决这个奇怪的,间歇性的问题?

+1

您能否提供带有和没有此错误的示例网址? – 2011-06-04 06:14:09

+0

@floatless谢谢,它似乎是非常小的文件没有创建支持文件的问题。 – 2011-06-04 19:43:29

回答

7

不要像这样使用Open :: URI。

简单地做:

file = open(url) 

然后你可以read文件,因为你有一个IO类型对象:

body = file.read 

body = open(url).read 

如果您需要的路径,用URI解析URL并获得路径。

2

根据docs SrtingIO dosnt有一个函数名称路径。

6

我肯定迟到了,但...

这个问题的根源是,如果你在低于10KB小的文件中使用open(url)将其转换成字符串IO对象自动神奇代替使用Tempfile。所有人都指出的StringIO对象没有定义path方法。

默认(10KB)由StringMax常数设置...

http://yard.ruby-doc.org/stdlib-2.1.0/OpenURI/Buffer.html

if defined?(OpenURI) && OpenURI::Buffer.const_defined?(StringMax) 
    OpenURI::Buffer.send('remove_const', StringMax) 
    OpenURI::Buffer.send('const_set', StringMax, 0) 
end 

景气的问题,解决了!

p.s.请务必使用#send,否则您无法访问#remove_const和#cont_set方法。 p.p.s.如果你做了很多小IO,我不会建议将它设置为零,因为创建的临时文件可能会比改变代码以正确使用StringIO更糟糕。这一切都取决于你的用例。

+0

你刚刚保存了我的培根! – Cameron 2014-07-25 04:23:37

+0

我希望我能多劳多得! – mmichael 2015-03-23 05:23:29

+0

这不适用于我,除非我将片段中的所有'StringMax'常量都更改为字符串。 – 2015-12-01 22:03:04

相关问题