【问题标题】:How to make carrierwave delete the file when destroying a record?销毁记录时如何使carrierwave删除文件?
【发布时间】:2011-09-27 01:25:07
【问题描述】:

我正在使用carrierwave gem 上传文件。

我已经建立了一个系统,供用户将图像标记为不合适的图像,并让管理员删除图像。据我所知,在图像上调用 destroy 只会从表中删除路径名。

有没有办法让carrierwave真正删除文件本身?或者当我销毁图像路径时,rails应该自动删除文件吗?

【问题讨论】:

    标签: ruby-on-rails ruby carrierwave


    【解决方案1】:

    就像@mu_is_too_short 说的,你可以使用File#delete。

    这是一个代码 sn-p,您可以在您的 rails 应用程序中稍作调整,将其用作助手。

    def remove_file(file)
      File.delete(file)
    end
    

    或者如果您只是将文件名存储在 file

    中
    def remove_file(file)
      File.delete("./path/to/#{file}")
    end
    

    【讨论】:

    • File#delete 和 FileUtils.rm 有什么区别?
    • 在 2.2.2 中,File.delete 将文件名作为单独的参数,并将返回删除文件数的整数。它还会对任何错误引发异常。 FileUtils.rm 接受文件名的列表或字符串,也可以传递像 :force => true 这样不会引发异常的选项。
    【解决方案2】:

    不确定 CarrierWave 对此提供了什么,但您可以在 Ruby 标准库中使用带有 ActiveRecord 回调的 FileUtils。

    例如,

    require 'FileUtils'
    before_destroy :remove_hard_image
    
    def remove_hard_image
      FileUtils.rm(path_to_image)
    end
    

    旁注:这段代码来自记忆。

    【讨论】:

    • 核心类中还有File#delete。
    • require 'fileutils' 如果你不想收到关于常量的各种警告。
    • 将 gem 用于像这样直截了当的事情,尤其是。标准库提供的这似乎没有必要。 +1 文件#delete
    • 哦,嗯。 IIRC 我正在查看文档并没有看到它。感谢您指出这一点。
    【解决方案3】:

    如果想删除一个文件但不想指定完整的文件名,您可以使用下面的。

    也可用于删除多个文件或具有特定扩展名的目录中的所有文件...

    file = Rails.root.join("tmp", "foo*") 
    

    或

    file = Rails.root.join("tmp", ".pdf")  
    

    files = Dir.glob(file) #will build an array of the full filepath & filename(s)
    files.each do |f|
      File.delete(f)
    end
    

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 2020-02-08
      • 2014-01-22
      • 1970-01-01
      • 2011-07-01
      • 2017-04-18
      • 1970-01-01
      • 2023-01-21
      • 2015-11-12
      相关资源
      最近更新 更多