2011-11-03 1 views
4

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

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

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

ответ

4

Я решил это с этим:

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 
+0

где вы его размещаете? в загрузчике? или на модели? – maumercado

+0

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

+0

@ user1055045 - нам не нужны два обратных вызова, так как after_destroy все еще имеет доступ к id. – vikram

4

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

cd /your/uploads/dir && find . -type d -empty -exec rmdir {} \; 
+0

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

4

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

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 

Где Крепление - это то, что вы установили_as Например: если у вас есть mount_uploader :avatar, AvatarUploader затем

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

и что если по какой-то странной причине путь есть? Лучше поставьте защиту вокруг этого 'remove_dir' – Tilo

Смежные вопросы