我觉得这会在脸上结束,但是我已经敲了很长时间。
我有一个Rails seed.rb文件,它从特定目录获取所有文件,为每个文件创建一个新对象,并通过Paperclip保存文件:
Dir["./**/*.jpg"].each do |f|
...
p = Picture.new
File.open(f, 'r') { |photo_file| p.photo = photo_file }
p.save!
....
end
其中photo
是Paperclip指定的属性(picture.rb):
has_attached_file :photo,
:styles => { :medium => "500x500>", :thumb => "100x100#" },
:processors => [:rotator]
我的问题是经过一些文件(有时50次,有时2次)后脚本退出并出现以下错误:
No such file or directory - /var/folders/oD/oDq1WD11EEaXmfi8VfNvfE+++TM/-Tmp-/stream,22423,0,22423,0
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `stat'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `block in fu_each_src_dest'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1423:in `fu_each_src_dest0'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1405:in `fu_each_src_dest'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:504:in `mv'
/Users/patgeorge/.rvm/gems/ruby-1.9.2-head@rails3/bundler/gems/paperclip-61f74de14812cabc026967a2b2c3ca8cbd2eed69-master/lib/paperclip/storage.rb:42:in `block in flush_writes'
我想也许我没有关闭文件,但根据Ruby IO docs使用open
的块会关闭文件。
显然我不认为自己经常这样做,所以这不是一个大问题。这令人沮丧和困惑。
我正在运行Ruby 1.9.2 r28142,Rails 3.0.0.beta4和Paperclip 2.3.3。
其他
尝试Winfield的建议我的代码块现在看起来像这样:
Dir["./**/*.jpg"].each do |f|
...
File.open(f, 'r') do |photo_file|
p = Picture.new
p.photo = photo_file
p.save!
end
...
end
但仍会定期收到错误。
更多信息:
我注意到,当我第一次运行脚本时,它可以执行大量文件(大约12个)。当我继续运行时,数字减少到我一次只能做2个。我不知道我在做什么让它“重置”并处理更多。但我认为这是关键。
答案 0 :(得分:1)
在您将其读入回形针之前,我肯定会关闭您打开的文件句柄。
带有块的File.open()打开文件,将其传递给块,并在块执行后关闭它。这意味着它可能会在你调用p.save之前关闭!
尝试在文件块中创建所有照片:
File.open(f, 'r') {|photo_file| Picture.create!(:photo => photo_file) }
答案 1 :(得分:1)
这个猴子补丁解决了这个问题: