2011-06-04 67 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

相關問題