2014-09-12 2 views
0

Я пытаюсь удалить каталог Amazon S3 после выполнения действия destroy на моем контроллере.Удаление каталога Amazon S3

контроллеры \ videos_controller.rb:

def destroy 
    @video = Video.find(params[:id]) 
    @video.destroy 
    redirect_to videos_path, notice: "The video #{@video.name} has been deleted." 
end 

модели \ video.rb:

after_destroy :remove_S3_directory 

def remove_S3_directory 
    path_to_be_deleted = "https://s3.amazonaws.com/bucket/uploads/video/attachment/(ID of the video)" 
    FileUtils.remove_dir(path_to_be_deleted, :force => true) 
end 

Как я могу указать path_to_be_deleted без жесткого кодирования пути?

+0

В какое поле содержится видео? –

+0

@ShamsulHaque - «приложение» - это поле, на котором фактически есть видеофайл. В настоящее время мои видеоролики хранятся на странице «http://s3.amazonaws.com/bucket_name/uploads/video/attachment/1», причем «1» является уникальным идентификатором видео в db. Мне нужно удалить каталог, в котором находится видео. – Vee

ответ

1

Я в конечном итоге установка AWS-SDk камень Амазонки (carrierwave-камень будет SDK также работать вместо aws- sdk) и использование метода AWS delete_all для удаления всех файлов на основе префикса. Формат для использования этого метода заключается в следующем:

s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix('uploads/video/attachment/1/').delete_all 

Таким образом, я поместил следующий код в мой контроллер:

def destroy 
    @video = Video.find(params[:id]) 

    # Manipulating the string that points to the path under "bucket" 
    directory_to_be_deleted = File.dirname(@video.attachment.url) 
    bucket = ENV['AWS_BUCKET'] + '/' 
    directory_to_be_deleted = directory_to_be_deleted.split(bucket)[1] 
    directory_to_be_deleted = directory_to_be_deleted + '/' 

    # Use Amazon APIs to remove directory 
    s3 = AWS::S3.new(:access_key_id => ENV['AWS_KEY_ID'], :secret_access_key => ENV['AWS_KEY_VALUE']) 
    s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix(directory_to_be_deleted).delete_all 

    @video.destroy 
    redirect_to videos_path, notice: "The video #{@video.name} has been deleted." 
end 

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

0

Try таким образом: -

В контроллерах \ videos_controller.rb:

def destroy 
    @video = Video.find(params[:id]) 
    vid = @video 
    @video.destroy 
    path_to_be_deleted = vid.attachment 
    FileUtils.remove_dir(path_to_be_deleted, :force => true) 
    redirect_to videos_path, notice: "The video #{vid.name} has been deleted." 
end 
+0

Спасибо за попытку, но это не сработало. Один из файлов был удален, но каталог остался нетронутым. Должна ли пустая папка удаляться? – Vee

+0

просто удалил все файлы в каталоге S3 сначала, прежде чем вызвать действие destroy в контроллере, но не изменил; каталог на Amazon не был удален. – Vee

+0

Что вы подразумеваете под 'Должна ли папка быть пустой для удаления?' –

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