2014-08-30 2 views
0

У меня есть ваниль Carrierwave, Fog, S3 setup. Загрузка на S3 прекрасна, но когда я уничтожаю запись в своей консоли rails локально или удаляю из своего веб-приложения по ссылке Delete, он не удаляет файл на S3.Как получить Carrierwave для удаления файла с S3?

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

Started DELETE "/posts/13" for 127.0.0.1 at 2014-08-30 04:19:39 -0500 
Processing by PostsController#destroy as HTML 
    Parameters: {"authenticity_token"=>"jcyevWU9M=", "id"=>"13"} 
    Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 13]] 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 
    (0.3ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 1]] 
    (0.2ms) BEGIN 
    Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE (("posts"."ancestry" ILIKE '13/%' OR "posts"."ancestry" = '13')) 
    Role Load (0.2ms) SELECT "roles".* FROM "roles" WHERE "roles"."resource_id" = $1 AND "roles"."resource_type" = $2 [["resource_id", 13], ["resource_type", "Post"]] 
    SQL (0.3ms) DELETE FROM "posts" WHERE "posts"."id" = $1 [["id", 13]] 
    (0.4ms) COMMIT 
Redirected to http://localhost:3000/posts 
Completed 302 Found in 401ms (ActiveRecord: 2.2ms) 

Это мой file_uploader.rb файл:

# encoding: utf-8 

class FileUploader < CarrierWave::Uploader::Base 
    storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "files/#{SecureRandom.uuid()}" 
    end 

    def extension_white_list 
    %w(pdf) 
    end 
end 

Это моя Post.rb модель файла:

# == Schema Information 
# 
# Table name: posts 
# 
# id   :integer   not null, primary key 
# status  :string(255) 
# title  :string(255) 
# photo  :string(255) 
# body  :text 
# created_at :datetime 
# updated_at :datetime 
# user_id :integer 
# ancestry :string(255) 
# file  :string(255) 
# 

class Post < ActiveRecord::Base 
    has_ancestry 
    belongs_to :user 
    resourcify 

    mount_uploader :photo, PhotoUploader 
    mount_uploader :file, FileUploader 
end 

Это это мое действие удаления на моем PostsController.rb:

# DELETE /posts/1 
    # DELETE /posts/1.json 
    def destroy 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

Мне никогда не удавалось извлечь файл из этого ведра S3 с помощью этого пользователя AWS IAM, который я создал для этого приложения.

Что может быть причиной этого?

ответ

4

Проблема с вашим загрузчиком. Вы используете безопасный случайный для магазина каталог.

def store_dir 
    "files/#{SecureRandom.uuid()}" 
end 

Когда несущая волна пытается удалить файл, то из-за случайного значения store_dir указывается на другое место. Я уверен, что вы также не сможете отобразить этот файл в любом месте.

Так что попробуйте что-то подобное или что-то, что не случайно изменяется.

def store_dir 
    "files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 
+0

Вы на 100% не сможете отображать этот файл в любом месте. Интересно! Так нет ли способа получить случайные имена папок? – marcamillion

+0

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

+0

Так это просто имена файлов, которые могут быть случайными? - https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Create-random-and-unique-filenames-for-all-versioned-files – marcamillion