AWS S3 集成产生未定义的方法“匹配”

AWS S3 integration yields undefined method `match'

我正在做一个使用 Paperclip 上传图片的简单项目。在我尝试将 S3 与 Paperclip 集成之前,一切都运行良好。在 'uploading' 用户图像上,我收到 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'

我尝试过的事情:

可能值得一提的是,我之前安装了 fog gem 以开始配置 Google 云存储,但决定坚持使用 S3。我使用 gem uninstall fog 删除了 gem 但似乎仍然存在一些依赖项。

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

:s3_region 添加到您的配置映射:

例如

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 功能(测试版)。因此文档中没有任何内容。但是有a comment about it in the actual 5.0 code.

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

:s3_permissions => 'public-read'