2013-06-25 2 views
9

Я хотел был бы установить определенный uploader так, что когда родственный объект модели будет уничтожен, файл на amazon s3 не будет удален.Я хотел был бы остановить несущую волну удаляя архив

Причина этого в том, что моя запись о модели загрузки, хотя и была уничтожена, по-прежнему упоминается во второй таблице аудита.

Я использую туман, несущую и s3.

ответ

9

Ну AFAIK remove_previously_stored_files_after_update работать только тогда, когда объектная модель updated поэтому установка его false не удалить старые file в течение update

Но в вашем случае, вы должны убедиться, файл все еще присутствует, когда соответствующий объект модели уничтожить

ну я не думаю, что там (если вы исследуете код here) является любой механизм, в настоящее время доступен в в Carrierwave сделать

но вы можете перезаписать remove!, чтобы достичь того же я предполагаю, что это предполагает создание attr_accessor (который является флаг, чтобы решить, следует ли сохранить файл или удалить его)

Внутри нужной модели определит attr_accessor (скажу keep_file)

и в желаемом загрузчике отменить удаление! Метод

class MyUploader < CarrierWave::Uploader::Base 
    def remove! 
    unless model.keep_file 
     super 
    end 
    end 
end 

и убедитесь, что вы установили attr_accessor для объекта (если вы хотите сохранить удаленный файл), прежде чем уничтожить их

Пример

u = User.find(10) 
u.keep_file = true 
u.destroy 

Это гарантирует, что файл убираются если запись удалена из базы данных

Сообщите мне, если это будет сделано лучше

Надежда эта помощь

7

Keeping files for all, or some uploaders

CarrierWave.configure do |config| 
    config.remove_previously_stored_files_after_update = false 
end 

Если вы хотите настроить, что на каждого закачано основе:

class AvatarUploader < CarrierWave::Uploader::Base 
    configure do |config| 
    config.remove_previously_stored_files_after_update = false 
    end 

    ... 
end 
+0

Спасибо Дэйв, к сожалению, у меня уже было это, и он не работает. Любые мысли о том, почему это может потерпеть неудачу, у меня есть это в загрузчике. – nodrog

+0

@DaveNewton Я не думаю, что он будет работать. Он работает только в случае обновления, не удаляя запись. – Viren

10

На самом деле есть способ сделать это, нужно просто пропустить обратный вызов, который удаляет его:

skip_callback :commit, :after, :remove_<column_name>! 

, например

# user.rb 
mount_uploader :avatar 
skip_callback :commit, :after, :remove_avatar! 

см https://github.com/carrierwaveuploader/carrierwave#skipping-activerecord-callbacks

+1

он работает !! благодаря – joselo