【问题标题】:In Rails 5.2, using Carrierwave gem how can I use the default gem when the file no longer exists on disk?在 Rails 5.2 中,使用 Carrierwave gem 当磁盘上不再存在文件时如何使用默认 gem?
【发布时间】:2019-03-26 23:17:42
【问题描述】:

我在 Rails 5.2.2.1 上使用 Carrierwave gem。当数据库中不存在该记录的图像时,我将其设置为图像的默认 URL。但是,如果我在数据库中有用于记录的图像,但磁盘上不存在该文件,我如何让它也显示出来?

目前,我收到以下错误:

ActionController::RoutingError(没有路由匹配 [GET] "/uploads/player/314c38a9-6567-4faa-bfda-9e7a75cbaed4.jpeg")

有没有办法拯救和呈现我在上传器文件中指定的默认网址?

【问题讨论】:

  • 这里有些奇怪,因为你得到的是RoutingError,而不是实际的404。你有路由设置来处理GET /uploads/player/*吗?这似乎也有点像数据完整性问题。如果磁盘上不存在这些文件,我会将它们从数据库中删除。然后您的应用程序代码可以识别该记录没有文件。
  • @mroach,我似乎在任何地方都没有设置该路线。我同意这是一个数据完整性问题,因为该文件不再存在于磁盘上,应该被删除。但仍在试图弄清楚是否有办法做到这一点,而不是编写一个可以运行并经常检查文件是否在磁盘上的脚本
  • 问题似乎是您的数据库记录有根本没有处理的文件路径。例如,我希望 /uploads/player/* 路由由静态文件服务处理,但 Rails 正试图像普通路由一样处理它。因此,只要您的数据库生成错误的路径,您就会遇到路由错误。 @ilyaostov 的解决方案是避免这种情况的方法。

标签: ruby-on-rails carrierwave actioncontroller


【解决方案1】:

如果你有一个默认图像,你可以像这样在你的模型中设置方法

def image
  File.file?(file.path) ? file.url : default_image_url #and you need to define this default url
end

或者您可以在路线中提到@mroach 处理图像上的 404

【讨论】:

  • 有没有更好的方法将它合并到我用 Carrierwave 创建的 Uploader 文件中,这样我就没有另一种方法来替换图像了?例如,我可以覆盖上传者的 .url 方法来处理这个吗?
  • 您需要有使用上传器的模型。在那里你可以设置这个方法。重写 URL 方法是不好的做法。您可以在 Carrierwave 存储库中查看此方法的源代码,并查看您可以通过此破坏什么)
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多