Пустые папки при удалении файла с помощью CarrierWave

#ruby-on-rails-3.1 #mongoid #carrierwave

#ruby-on-rails-3.1 #mongoid #carrierwave

Вопрос:

Когда я удаляю загруженный файл с помощью CarrierWave и Mongoid, он удаляет файл, но оставляет пустые папки.

 /files/:user_id/images/:file_id/ ['image.png', 'content_image.png', 'thumb_image.png']
  

Я хочу :file_id , чтобы папка также удалялась при удалении файла. Есть ли способ сделать это?

Ответ №1:

Я решил это с помощью этого:

   before_destroy :remember_id
  after_destroy :remove_id_directory

  protected

  def remember_id
    @id = id
  end

  def remove_id_directory
    FileUtils.remove_dir("#{Rails.root}/path/to/folder/#{@id}", :force => true)
  end
  

Комментарии:

1. где вы это размещаете? в загрузчике? или в модели?

2. after_destroy, похоже, вписывается в модель: undefined method 'after_destroy' for ImportUploader:Class

3. @user1055045 — нам не нужны два обратных вызова, поскольку after_destroy все еще имеет доступ к id.

4. БУДЬТЕ ОСТОРОЖНЫ! убедитесь, что путь, который вы указываете remove_dir для удаления, соответствует тому, что вы собираетесь удалить. Дополнительный оператор IF вокруг этого remove_dir оператора не повредит. 😉

5. вау,,, он удаляет все файлы для меня.. что, если я хочу удалить только определенный файл?

Ответ №2:

Вы можете запускать ежедневное задание cron для удаления каталогов:

 cd /your/uploads/dir amp;amp; find . -type d -empty -exec rmdir {} ;
  

Комментарии:

1. Что говорит против этого? Я пойду с этим решением. Спасибо

Ответ №3:

Вы также можете сделать так:

 after_destroy :remove_file_directory


 def remove_file_directory
    path = File.expand_path(mount.store_path, mount.root)
    FileUtils.remove_dir(path, force: false)
 end
  

Где mount — это то, что вы смонтировали, например: если у вас есть mount_uploader :avatar, AvatarUploader , то

  def remove_file_directory
    path = File.expand_path(avatar.store_path, avatar.root)
    FileUtils.remove_dir(path, force: false)
 end
  

Комментарии:

1. а что, если по какой-то странной причине путь равен / ? Лучше позаботиться об этом remove_dir