Rails 6 找不到活动存储附件 404

Rails 6 Active Storage Attachment 404 not found

我在使用 Active Storage 的 Rails 6 应用程序中遇到了一个非常奇怪的问题。

您可以将 PDF 文件添加到通过 Active Storage 存储的反馈中 - 在开发中这没有问题,您可以保存并打开它。

它在生产中也能正常工作,但是当我使用 Capistrano 重新部署应用程序时出现问题。在部署之前,到目前为止保存的所有文件都可以毫无问题地显示出来。重新部署后,不再找到之前存储的文件 - 数据库没有任何变化。

这是我的视图代码(我也通过控制器尝试了 url_forrails_blob_pathservice_url

这就是我的日志在重新部署之前所说的(成功显示文件):

Started GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MDg6MjIuOTQ5WiIsInB1ciI6ImJsb2Jfa2V5In19--0a52cfc77ce14105dc290ff569d50b637231f613/WebMenue%20Pr%C3%B5sentation.pdf?content_type=application%2Fpdf&disposition=inline%3B+filename%3D%22WebMenue+Prosentation.pdf%22%3B+filename%2A%3DUTF-8%27%27WebMenue%2520Pr%25C3%25B5sentation.pdf" for 172.16.118.100 at 2020-07-14 20:03:48 +0200

Processing by ActiveStorage::DiskController#show as PDF

Parameters: {"content_type"=>"application/pdf", "disposition"=>"inline; filename=\"WebMenue Prosentation.pdf\"; filename*=UTF-8''WebMenue%20Pr%C3%B5sentation.pdf", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MDg6MjIuOTQ5WiIsInB1ciI6ImJsb2Jfa2V5In19--0a52cfc77ce14105dc290ff569d50b637231f613", "filename"=>"WebMenue Prõsentation"}

Completed 304 Not Modified in 1ms (ActiveRecord: 0.0ms | Allocations: 370)

然后,在重新部署后,我在完全相同的文件上收到此 404 未找到错误:

Started GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MTI6MzQuNTE3WiIsInB1ciI6ImJsb2Jfa2V5In19--9d281265e57a7c0d3cd53af1f8e1a6e098605d3c/WebMenue%20Pr%C3%B5sentation.pdf?content_type=application%2Fpdf&disposition=inline%3B+filename%3D%22WebMenue+Prosentation.pdf%22%3B+filename%2A%3DUTF-8%27%27WebMenue%2520Pr%25C3%25B5sentation.pdf" for 172.16.118.100 at 2020-07-14 20:07:34 +0200

Processing by ActiveStorage::DiskController#show as PDF

Parameters: {"content_type"=>"application/pdf", "disposition"=>"inline; filename=\"WebMenue Prosentation.pdf\"; filename*=UTF-8''WebMenue%20Pr%C3%B5sentation.pdf", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MTI6MzQuNTE3WiIsInB1ciI6ImJsb2Jfa2V5In19--9d281265e57a7c0d3cd53af1f8e1a6e098605d3c", "filename"=>"WebMenue Prõsentation"}

Completed 404 Not Found in 2ms (ActiveRecord: 0.0ms | Allocations: 799)

知道这里发生了什么吗?可能是 NGINX 文件缓存问题或其他问题?

好的,在深入研究之后我发现了为什么会发生这种情况 - 我将尝试解释它以防有人在使用 Capistrano 进行部署时遇到类似问题。

因此,这不是直接的 Rails 或 Active Storage 相关问题。我为我的附件使用本地存储,所以我不将它们存储在 Amazon 或 Google 或 Azure - 这些附件的默认存储位置是应用程序根目录中的 'storage' 文件夹 - 所以我检查了 storage.yml:

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

在我的 production.rb 中:

  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :local

我的问题如下:默认情况下,此文件夹本身 添加到 .gitignore,只是 里面的内容 该文件夹被 GIT 忽略。 所以碰巧我每次做 git push 时都会将一个空的存储文件夹推送到我的 repo。这当然会 覆盖 以前在生产中使用 Capistrano 的每个部署中使用的存储文件夹。

解决我的问题的方法是将存储文件夹添加到 linked_dirs 数组,您可以在 deploy.rb:

中指定
append :linked_dirs, 'log', 'storage', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads', 'node_modules'

设置此选项后,该文件夹不会在每次部署时被覆盖,而是会在各版本之间共享,并且之前上传的文件仍可访问。

如果你问自己为什么你的文件消失了,我希望这对以后的人有所帮助:')。