AWS S3集成出现undefined method 'match'错误

20

我正在使用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来删除gem,但是似乎留下了一些依赖关系。


我也遇到了同样的问题。你找到解决方法了吗? - rguerrettaz
1
你尝试过添加 :s3_region => 'us-east-1'(或者你的 s3 所在的区域)吗?这里有一个链接可能会有所帮助:https://github.com/thoughtbot/paperclip/blob/95acf3b898bd782f4429d42fd2d8812505390328/lib/paperclip/storage/s3.rb#L96 - rguerrettaz
1
是的,我发现一旦添加了我的AWS区域,它似乎就可以正常工作了。如下面的答案所提到的,文档中并没有详细说明 - 而且更令人困惑的是,我基本上是从另一个已经无误地工作的项目中复制和粘贴的代码。 - PSCampbell
2个回答

38
在您的配置图中添加: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 的新功能(测试版)。因此文档中没有相关内容。但在实际的 5.0 代码注释了相关信息

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

:s3_permissions => 'public-read'

现在v5已正式发布,这一点已在其升级文件中UPGRADING记录下来。 - Nick
1
请注意,:region 的值在您的文件传递中。例如:EU (Frankfurt) 对应 eu-central-1 - Alain ANDRE
AWS区域和终端节点 http://docs.aws.amazon.com/zh_cn/general/latest/gr/rande.html - askrynnikov

2
你需要在你的中指定区域,例如:region: ENV["AWS_REGION"]。 至于清理未使用的gems,你可以运行bundle clean

1
在将 :s3_region 添加到 development.rb 后,您是否重新启动了应用程序? - simmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接