Частое "Нет такого файла или каталога" при сохранении файлов через Paperclip - PullRequest
3 голосов
/ 17 июля 2010

Я чувствую, что это закончится через мгновение, но я слишком долго стучал по нему головой.

У меня есть файл 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]

Myпроблема в том, что после некоторого количества файлов (иногда 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 , использующие блок из open, закроют файл.

Очевидно, я не вижу необходимости часто запускать это, так что это не большая проблема.Это просто расстраивает и сбивает с толку.

Я использую Ruby 1.9.2 r28142, Rails 3.0.0.beta4 и Paperclip 2.3.3.

Дополнительно:

При попытке Уинфилда мой блок кода теперь выглядит следующим образом:

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 за раз.Я не уверен, что я делаю, чтобы сделать это "сбросить" и обрабатывать больше.Но я думаю, что это ключ.

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Этот патч обезьяны решил проблему:

http://github.com/thoughtbot/paperclip/issues/issue/262/

1 голос
/ 17 июля 2010

Мне кажется, вы закрываете дескриптор файла, который открыли, прежде чем прочитать его в скрепке

File.open () с блоком открывает файл, передает его в блок и закрывает после выполнения блока. Это означает, что он, скорее всего, закрыт перед вызовом p.save!

Попробуйте сделать все ваши фото создания внутри вашего блока файлов:

File.open(f, 'r') {|photo_file| Picture.create!(:photo => photo_file) }
...