2012-06-28 34 views
2

我有一個紅寶石bash腳本來下載一個zip文件並輸出一個進度條到標準輸出。我有以下紅寶石不能轉換哈希到Int

# Temp file name 
tmp = ActiveSupport::SecureRandom.hex(8) 
file = temp_dl_dir+tmp+'.zip' 

print file.inspect 

# Download 
progress_bar = nil 
open(file, 'w', :content_length_proc => lambda { |length| 
    if length && 0 < length 
    progress_bar = ProgressBar.new('...', length) 
    progress_bar.file_transfer_mode 
    end 
}, 
:progress_proc => lambda { |progress| 
    progress_bar.set(progress) if progress_bar 
}) do |fo| 
    fo.print open(dl).read 
end 

但是當我運行它,我得到

open-uri.rb:32:in `initialize': can't convert Hash into Integer (TypeError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open_uri_original_open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open' 
    from ./site.rb:191 (line 191 is the open(file, 'w' ...) one) 

這意味着有與我open(file, 'w' ...功能

一個問題,我想不出有什麼不對+ _ +

+0

我只是要問同樣的事情。抱怨哪一行是堆棧跟蹤? – nickgroenke

+0

191行是打開的(文件'w',...)一行32行是'def is_dir?(directory)' – Steven

+0

哦,我不知道這個問題是否與第三個參數打開? open中的第三個參數是「:content_length_proc => lambda ...」,它是一個散列。堆棧跟蹤正在討論open-uri.rb:32。所以也許這個打開的電話會期待第三個參數是一個Int。 – nickgroenke

回答

4

:content_length_proc似乎與OpenURI::OpenRead#open有關。 (由ri open檢查然後搜索:content_length_proc

ri此方法的文檔說:

然而,mode必須閱讀的模式,因爲OpenURI::OpenRead#open不支持 寫模式(還)。另外perm被忽略,因爲它僅對文件 創建有意義。

因此,您不能使用OpenURI::OpenRead#open'w'模式。如果這是您的實際目標,您必須使用其他機制來寫入您的網址。 (你的英語介紹說,你想下載一個文件,但你不會在這種情況下使用'w'模式的OpenURI::OpenRead#open方法...)

+0

+1,要引用完全相同的語句:) –