我在Heroku上运行了一个带有Paperclip的Rails 4应用程序。我最近开始遇到一个问题,阻止我更新任何附加图像的模型。例如,每当我通过网站的CMS系统更改为Company
模型时,都不会保存更改。我试过只改变图像,图像和各种其他属性,只改变非图像属性。好像在我的控制器的更新操作中永远不会调用@company.save
。
我找到this issue report并尝试了各种解决方案,但没有任何效果。
这是我的Company
模型:
class Company < ActiveRecord::Base
has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
validates_attachment_content_type :logo, :content_type => /\Aimage\/.*\Z/
end
在我的日志中,我收到以下错误:
[AWS S3 404 0.022711 0 retries] head_object(:bucket_name=>"myApp",:key=>"companies/profile_photos/000/000/118/original/2015-09-05_19.05.34.jpg") AWS::S3::Errors::NoSuchKey No Such Key
我验证了我的S3凭据是使用heroku config
设置的,并且它们是有效的。
我不确定,但我怀疑这可能与我最近添加的以下buildpack有关:
=== myApp Buildpack URLs
1. https://github.com/bobbus/image-optim-buildpack.git
2. https://github.com/heroku/heroku-buildpack-ruby.git
我无法在localhost上重现该问题。
更新
此后我就这个问题打开了issue report。
以下是config.paperclip_defaults
production.rd
块
config.paperclip_defaults = {
:storage => :s3,
:s3_protocol => :https,
:s3_host_name => 's3.amazonaws.com',
:s3_credentials => {
:bucket => ENV['S3_BUCKET_NAME'],
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
这是我的aws.yml
:
development:
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
production:
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
答案 0 :(得分:2)
假设您使用的是dotenv-rails ...
在development.rb和production.rb文件中:
config.paperclip_defaults = {
storage: :s3,
s3_host_name: ENV['S3_HOST_NAME'],
bucket: ENV['S3_BUCKET_NAME']
}
确保在Heroku环境中设置这些变量:
$ heroku config:set S3_HOST_NAME=your-s3-hostname-here S3_BUCKET_NAME=your-production-bucket-name-here
这表明你应该有一个指定了这些细节的yaml文件,或者在你的模型上写一个方法。
答案 1 :(得分:1)
No Such Key
是S3说“404 Not Found”的方式。
我不相信它有任何其他含义。
请求已获得授权且语法有效,但指定路径中的存储桶中没有文件。
您可能希望从AWS控制台检查存储桶的内容。