【问题标题】:carrierwave file storage saved in public directory but rails does not recognize path载波文件存储保存在公共目录中,但 Rails 无法识别路径
【发布时间】: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 中。你显示一个 src dochive,这是一个错字吗?您说该应用程序在 localhost 中按预期提供图像,但您从未提及在不同的环境中运行该应用程序,您是否以两种不同的方式运行该应用程序?像/archive/3/.... 这样的东西确实会在public/archive/3/.... 寻找文件,你永远不会在url 中看到public
  • 是的,错字。发布了一个答案来说明对 Carrierwave 本地 store_dir 进行符号链接的必要性。

标签: ruby-on-rails carrierwave


【解决方案1】:

这个问题值得回答,因为它可能对其他用户有用。

Carrierwave 和 ActiveStorage 似乎确实能够共存,但我不确定是如何共存的,因为我没有记录所采取的每一步(并且我想测试这个假设以获得积极的结论)。

通过No route matches 错误消息创建了一种花园路径。

carrierwave 使用的public 目录在应用程序的每个版本中都会生成。因此,部署将获得新的public 目录,但不会为部署之前加载的项目指向正确的目录。需要符号链接。

解决方法是编辑deploy.rb,在这种情况下:

append :linked_dirs, 'public/archive'

注意:这应该用于store_dir定义的载波

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多