我正在使用carrierwave
和carrierwave-aws
宝石从Rails应用程序上传到S3。我可以毫无问题地上传文件,但我无法从S3中删除它们。
我的ActiveRecord模型名为Episode,其视频属性由我的CarrierWave::Uploader::Base
上传者(包括CarrierWave::Video
)设置。
以下是我遵循的步骤:
episode.remove_video!; episode.save!
我也试过了:
episode.video.remove!
episode.save!
哪个产生此输出,但不从S3中删除文件:
[180] pry(main)> episode.video.remove!
=> [:remove_versions!]
我也试过了:
episode.destroy!
应该调用ActiveRecord回调added by Carrierwave,但不是。我添加了自己的before_destroy方法(下面为destroy_assets
),但这也不起作用。
这是我的设置:
carrierwave.rb
CarrierWave.configure do |config|
config.storage = :aws
config.aws_bucket = 'BUCKET_NAME'
config.aws_acl = 'public-read'
config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7
config.aws_attributes = {
expires: 2.week.from_now.httpdate,
cache_control: 'max-age=604800'
}
config.aws_credentials = {
access_key_id: ENV['aws_access_key'],
secret_access_key: ENV['aws_secret'],
region: 'us-east-1'
}
config.remove_previously_stored_files_after_update = true
end
video_uploader.rb
class VideoUploader < CarrierWave::Uploader::Base
include CarrierWave::Video
storage :was
def store_dir
"uploads/videos/#{model.id}"
end
end
episode.rb
class Episode < ActiveRecord::Base
mount_uploader :video, VideoUploader
before_destroy :destroy_assets
def destroy_assets
self.video.remove! if self.video
self.save!
end
end
我正在使用的AWS凭据适用于具有AmazonS3FullAccess
政策的IAM用户,如果这有任何区别的话。
答案 0 :(得分:1)
我会将你的store_dir更新为:
"uploads/videos/#{mounted_as}/#{model.id}"
因此,当使用安装系统时,carrierwave删除文件,它在内部调用全名方法时知道在哪里找到它!