如何使用Rails、CarrierWave和Fog在文件销毁或覆盖时忽略丢失文件的处理?

更新于
2026-10-09 22:35:07
1阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计526个文字,预计阅读时间需要3分钟。

如何使用Rails、CarrierWave和Fog在文件销毁或覆盖时忽略丢失文件的处理?

在Rails中,正确的方法是使用`CarrierWave`的`remove!`方法来删除附件或图像,而不是使用`Fog.delete`或`Fog.destroy`。如果你在导入RackSpace后丢失图像,可能需要清理一些记录。

以下是一些丢失图像和记录的例子:

- 丢失的图像:`/uploads/user/avatar/123456/image.jpg`- 丢失的记录:`User.find(123456).avatar_file_name` 返回`nil`

如何使用Rails、CarrierWave和Fog在文件销毁或覆盖时忽略丢失文件的处理?

尝试删除记录时,你可能会收到错误:

Error: Cannot find attachment with id '123456'

确保在删除记录之前,图像文件已经从服务器上删除。

Rails中的正确方法是什么是CarrierWave在丢失附件/图像时使用Fog删除/销毁记录?

我想在丢失图像导入RackSpace后清理一些记录.有一些丢失的图像和拇指.当我尝试删除记录时,我收到错误

雾::存储:: Rackspace公司:: NOTFOUND

是否有CarrierWave或Fog设置使其更能容忍这些场景?

我刚刚遇到这个问题,发现原始问题在这里提交: github.com/jnicklas/carrierwave/issues/481和描述修复的维基页面: github.com/jnicklas/carrierwave/wiki/How-To%3A-Silently-ignore-missing-files-on-destroy-or-overwrite

但是我对解决方案不满意,我不想将这两种方法添加到我使用上传器的所有模型中.我倾向于编写1个基本上传器和子类,以满足特定需求的任何变化.所以我挖掘了这些方法:删除_#{column_name}!和remove_previously_stored _#{column_name}并在此处找到主题:github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/mount.rb#L204和github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/mount.rb#L204

这两种方法都只是调用remove!在上传者.因此,解决问题的最简单方法是覆盖删除!上传器中的方法.然后你只需要覆盖一个方法并在一个地方.我的覆盖如下所示:

class CloudfilesUploader < CarrierWave::Uploader::Base # Override to silently ignore trying to remove missing previous file def remove! begin super rescue Fog::Storage::Rackspace::NotFound end end end

当尝试重新上传图像并覆盖不存在的图像或者只是尝试删除不存在的图像时,这应该可以解决您的问题.

〜汤姆

本文共计526个文字,预计阅读时间需要3分钟。

如何使用Rails、CarrierWave和Fog在文件销毁或覆盖时忽略丢失文件的处理?

在Rails中,正确的方法是使用`CarrierWave`的`remove!`方法来删除附件或图像,而不是使用`Fog.delete`或`Fog.destroy`。如果你在导入RackSpace后丢失图像,可能需要清理一些记录。

以下是一些丢失图像和记录的例子:

- 丢失的图像:`/uploads/user/avatar/123456/image.jpg`- 丢失的记录:`User.find(123456).avatar_file_name` 返回`nil`

如何使用Rails、CarrierWave和Fog在文件销毁或覆盖时忽略丢失文件的处理?

尝试删除记录时,你可能会收到错误:

Error: Cannot find attachment with id '123456'

确保在删除记录之前,图像文件已经从服务器上删除。

Rails中的正确方法是什么是CarrierWave在丢失附件/图像时使用Fog删除/销毁记录?

我想在丢失图像导入RackSpace后清理一些记录.有一些丢失的图像和拇指.当我尝试删除记录时,我收到错误

雾::存储:: Rackspace公司:: NOTFOUND

是否有CarrierWave或Fog设置使其更能容忍这些场景?

我刚刚遇到这个问题,发现原始问题在这里提交: github.com/jnicklas/carrierwave/issues/481和描述修复的维基页面: github.com/jnicklas/carrierwave/wiki/How-To%3A-Silently-ignore-missing-files-on-destroy-or-overwrite

但是我对解决方案不满意,我不想将这两种方法添加到我使用上传器的所有模型中.我倾向于编写1个基本上传器和子类,以满足特定需求的任何变化.所以我挖掘了这些方法:删除_#{column_name}!和remove_previously_stored _#{column_name}并在此处找到主题:github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/mount.rb#L204和github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/mount.rb#L204

这两种方法都只是调用remove!在上传者.因此,解决问题的最简单方法是覆盖删除!上传器中的方法.然后你只需要覆盖一个方法并在一个地方.我的覆盖如下所示:

class CloudfilesUploader < CarrierWave::Uploader::Base # Override to silently ignore trying to remove missing previous file def remove! begin super rescue Fog::Storage::Rackspace::NotFound end end end

当尝试重新上传图像并覆盖不存在的图像或者只是尝试删除不存在的图像时,这应该可以解决您的问题.

〜汤姆