【发布时间】:2021-10-11 07:17:52
【问题描述】:
Rails 6.1 应用程序中定义的载波上传器
storage :file
def store_dir
"archive/#{model.id}"
end
development.rb 确实定义了
config.active_storage.service = :local
文件和版本已正确处理并保存到archive 目录。
但是,调用时
attachment.image_url(:preview).to_s
链接已创建,但单击它会返回 Rails 路由错误:
No route matches [GET] "/archive/3/PHOTO-2021-10-02-17-29-15.jpg"
在浏览器窗口中调用图像的路径返回同样的错误。
/public/archive[...] 也会发生同样的情况,并且图像标签会返回断开的链接。
虽然可以理解,rails 可能面向图像标签,期望该文件位于 assets/images 目录中 - 应用程序仍将 html 标签写为
<img src="/archive/3/preview_PHOTO-2021-10-02-17-29-15.jpg" />
并且完整的 URL 不会在公用文件夹中找出某些内容,返回 no route 错误。
注意应用程序在本地主机下运行时按预期提供图像。行为上的差异令人担忧。
两种解决方案,因此问题:
a) 如何将 Carrierwave 定向到保存在assets/images 目录中
b) 如何正确生成此链接并使用应用程序 public 目录中的完整 URL 提供此链接
【问题讨论】:
-
您说您正在使用 CarrierWave 但也共享了 ActiveStorage 配置,如果您不使用 ActiveStorage,我会从问题中删除该部分。您不希望carrierwave 在/assets/images 中上传图片,图片应该在
/public中。你显示一个 srcdochive,这是一个错字吗?您说该应用程序在 localhost 中按预期提供图像,但您从未提及在不同的环境中运行该应用程序,您是否以两种不同的方式运行该应用程序?像/archive/3/....这样的东西确实会在public/archive/3/....寻找文件,你永远不会在url 中看到public -
是的,错字。发布了一个答案来说明对 Carrierwave 本地 store_dir 进行符号链接的必要性。