我有2个Carrierwave上传器 - ItemUploader
和ImageUploader
,我正在使用雾。
我可以很好地将文件上传到S3,但是执行销毁不会将其从S3中删除。
这是我的destroy
行动:
def destroy
@item = Item.find(params[:id])
@item.destroy
respond_to do |format|
format.html { redirect_to items_url }
format.json { head :no_content }
end
end
当我执行item.destroy
时,它会从我的数据库中删除该记录,但它不会从S3中删除该文件,也不会删除这些文件夹。
这是一个全新的S3存储桶,带有vanilla设置。也是一个全新的Carrierwave安装。
仅供参考:我已经尝试将@item.remove_item!
和@item.remove_image!
添加到控制器的销毁操作中,但这也没有完成。
修改1
所以看起来发生的事情是它删除了一个附件。
该模型有:
class Item < ActiveRecord::Base
# image :string(255)
# link :string(255)
mount_uploader :link, ItemUploader
mount_uploader :image, ImageUploader
end
因此,当我在控制台中删除某个对象时,会删除与ItemUploader
关联的对象,而不会删除与ImageUploader
相关的图像。
为什么会删除1而不删除另一个?
答案 0 :(得分:1)
我的控制台似乎有问题 - 因为一旦我通过网页UI删除了该对象,它就会删除S3中的所有相关对象。
但如果我通过控制台进行操作,则无效。
我将针对该特定问题打开另一个SO问题。
答案 1 :(得分:0)
如果您从cdn中引用文件(图像),它会删除但需要很少的时间。
答案 2 :(得分:-1)
使用aws sdk - https://github.com/amazonwebservices/aws-sdk-for-ruby
您可以构建一个外观来管理3上的对象,例如:
require 'aws-sdk'
class Facades::AmazonFacade
attr_reader :s3
#
# Connection to Amazon S3
#
def initialize
@s3 = AWS::S3.new(
:access_key_id => config['access_key_id'],
:secret_access_key => config['secret_access_key']
)
@bucket = @s3.buckets[self.config['bucket']]
end
def config
@@config ||= YAML::load(File.open("#{Rails.root}/config/amazon_s3.yml" ))[Rails.env]
end
####
def policy(bucket, options = {})
# Base 64 policy
end
def signature(bucket, options = {})
# Base64 signature
end
#
# Find object and get public urls
#
def url_link(obj, expires)
@bucket.objects[obj].url_for(:read, :secure => true, :expires => 10*60).to_s
end
def object_exists_on_amazon?(obj)
@bucket.objects[obj].exists?
end
def object_size(obj)
unless Rails.env.test?
@bucket.objects[obj].content_length
end
end
def object_upload_date(obj)
@bucket.objects[obj].last_modified
end
#
# create, delete objects
#
def store_object_on_amazon(obj, file, access)
@bucket.objects[obj].write(file, :acl => access)
end
def delete_object_on_amazon(obj)
@bucket.objects[obj].delete(:force => true)
end
end