Carrierwave文件未从S3中删除

时间:2015-08-30 02:12:52

标签: ruby-on-rails ruby amazon-s3 carrierwave

我正在使用carrierwavecarrierwave-aws宝石从Rails应用程序上传到S3。我可以毫无问题地上传文件,但我无法从S3中删除它们。

我的ActiveRecord模型名为Episode,其视频属性由我的CarrierWave::Uploader::Base上传者(包括CarrierWave::Video)设置。

以下是我遵循的步骤:

  1. 制作剧集
  2. 上传视频,验证它是否存在于S3(这可行!)
  3. 从控制台调用episode.remove_video!; episode.save!
  4. 此时,尽管没有收到任何错误消息,视频仍然存在于S3上
  5. 我也试过了:

    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用户,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:1)

我会将你的store_dir更新为:

"uploads/videos/#{mounted_as}/#{model.id}" 

因此,当使用安装系统时,carrierwave删除文件,它在内部调用全名方法时知道在哪里找到它!