AWS S3集成产生未定义的方法`match'

时间:2016-05-10 03:56:51

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

我正在使用Paperclip上传图像的简单项目。在我尝试将S3与Paperclip集成之前,一切都运行良好。在“上传”用户的图片后,我收到NoMethodError (undefined method 'match' for nil:NilClass):错误。这只有在我的S3配置运行时才会发生 - 如果我将文件评论完全上传。

我的配置:

development.rb:
....
....
  config.paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  }
}

我的模特:

 class User < ActiveRecord::Base
        has_attached_file :image_file, default_url: "/myapp/images/:style/missing.png"
        validates_attachment_file_name :image_file, matches: [/png\Z/, /jpeg\Z/, /tiff\Z/, /bmp\Z/, /jpg\Z/]

控制台的整个错误输出:

NoMethodError (undefined method `match' for nil:NilClass):
  app/controllers/images_controller.rb:33:in `block in create'
  app/controllers/images_controller.rb:32:in `create'

我尝试的事情:

  • 我将AWS密钥和存储桶名称直接添加到代码中 作为环境变量。

  • 如上所述,我在环境文件中注释掉了AWS配置,它似乎运行正常。

值得一提的是,我之前安装了fog gem以开始配置Google Cloud Storage,但决定坚持使用S3。我使用gem uninstall fog删除了宝石,但似乎有些依赖项留在后面。

2 个答案:

答案 0 :(得分:35)

:s3_region添加到配置图:

E.g。

config.paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  },
  :s3_region => ENV['AWS_REGION']
}

不幸的是,这是一个v5.0.0功能(在Beta中)。因此,在文档中没有任何关于它的内容。但是有a comment about it in the actual 5.0 code

另外值得注意的是,papertrail中的s3_permissions键现在需要一个字符串值(用于接受符号)。

:s3_permissions => 'public-read'

答案 1 :(得分:3)

您需要以s3_credentials之类的方式指定region: ENV["AWS_REGION"]中的区域。 至于清理未使用的宝石,您可以运行bundle clean