Refile Gem 当我向 Heroku 推送新提交时图像链接中断

Refile Gem Image Links Break When I Push a New Commit to Heroku

我的应用程序使用以下 gems:

gem "refile", require: "refile/rails"
gem "refile-s3"
gem "refile-mini_magick"

我的应用程序所做的是将图像文件上传到 AWS S3 实例,然后使用来自 Refile gem.

的辅助方法进行检索

当我在本地 运行 时,一切都按预期工作。

问题是当我将我的应用程序推送到 Heroku 时,我可以上传图像并正确显示。但是,当我将更新的提交推送到 Heroku 时,之前所有图像的链接都会中断。

我检查过页面上图像的 file_id 与 Heroku 数据库中图像的 file_id 相同。

这是我的图片上传表单:

  <div class="field">
    <%= f.label :images_files %><br>
    <%= f.attachment_field :images_files, multiple: true, presigned: true, direct: true %>
  </div>

这是显示的我的图片片段:

<%= attachment_image_tag(project.images.first, :file, :fill, 750, 400) %>

我已经在 Heroku 上正确设置了我的环境变量,以便它知道我的 AWS 实例的密钥(访问密钥 ID、秘密访问密钥和存储桶名称)。

这是上传到 S3 的访问器:

# config/initializers/refile.rb
require "refile/s3"

aws = {
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  region: "us-west-1",
  bucket: ENV['export S3_BUCKET'],
}

Refile.cache = Refile::S3.new(prefix: "cache", **aws)
Refile.store = Refile::S3.new(prefix: "store", **aws)

我注意到的另一件事是,如果我通过 Heroku 应用程序上传图像,我的 S3 存储桶没有将图像保存在正确的文件夹中。但是,如果我使用本地服务器上传图像,我可以在我的 S3 存储桶中看到该图像。我不确定为什么,因为所有的环境变量都是正确的,我已经仔细检查过了。

这是尝试加载图片的 Heroku 日志片段:

2016-01-12T23:04:39.448906+00:00 app[web.1]: Refile::App: Could not find attachment by id: d8fffa94c41f9f0ae1b233d69a75787a9a29340a9a83a831385d84d53ad8
2016-01-12T23:04:39.442789+00:00 heroku[router]: at=info method=GET path="/attachments/8718f3743b8d7c91e296ac5f0e6ea324d1fd2868/store/fit/800/475/aee08fe8f97269
826c51a77a11995c77467e24aa3581563d6f298e0dbf9b/file" host=www.domainname.com request_id=49edc34f-2d37-4ae4-9a58-e6265e00032e fwd="99.100.27.10" dyno=web.1 connect
=1ms service=9ms status=404 bytes=424

当我第一次开始开发这个应用程序时,我犯了一个愚蠢的错误。在我的 .gitignore 中,我放置了规则“/config/*”,因此它没有将我的访问器上传到 Heroku。

然后我删除了该规则并制定了更严格的规则来忽略包含密钥的敏感文件,即“/config/*.yml”

现在有效了,我希望有人能从我的可怕错误中吸取教训。