的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
答案 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是存储桶的名称,并键入要删除的对象的键。