为什么AWS :: S3 :: S3Object抱怨未定义的方法删除?

时间:2013-11-18 02:19:19

标签: ruby-on-rails amazon-s3

的Gemfile:

gem'aws-sdk'

gem'aws-s3'

当调用视频删除时,也会在视频模型中调用此方法:

 def remove_encoded_video
    unless output_url.blank?
      AWS::S3.new(
        :access_key_id     => zencoder_setting["s3_output"]["access_key_id"],
        :secret_access_key => zencoder_setting["s3_output"]["secret_access_key"]
      )
      AWS::S3::S3Object.delete(File.basename(output_url), zencoder_setting["s3_output"]["bucket"])    
      AWS::S3::S3Object.delete("/thumbnails_#{self.id}/frame_0000.png", zencoder_setting["s3_output"]["bucket"])
    end
  end

这两个:

AWS::S3::S3Object.delete(File.basename(output_url), zencoder_setting["s3_output"]["bucket"])

AWS::S3::S3Object.delete("/thumbnails_#{self.id}/frame_0000.png", zencoder_setting["s3_output"]["bucket"])

造成

VideosController#destroy中的NoMethodError

AWS :: S3 :: S3Object的未定义方法`delete':Class

1 个答案:

答案 0 :(得分:1)

我不相信这两个宝石'aws-sdk'和'aws-s3'是兼容的。你应该只使用其中一个。

AWS :: S3 :: S3Object的aws-sdk版本在类级别没有删除方法,仅在实例级别上。因此,您需要先创建S3Object,然后在使用'aws-sdk'时在S3Object上调用delete。

假设您的代码来自aws-s3的文档,如果您从Gemfile中删除gem 'aws-sdk'并重新捆绑,它可能会起作用。当然,如果您在其他地方使用'aws-sdk',这可能会破坏您应用中的其他代码。

更新:

您可以按如下方式获取和删除S3Object:

s3 = AWS::S3.new(:access_key_id => '...',
                 :secret_access_key => '...')

bucket = s3.buckets[bucket_name]
object = bucket.objects[key]
object.delete

其中bucket_name是存储桶的名称,并键入要删除的对象的键。