#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