【问题标题】:I would like to stop carrierwave deleting a file我想停止carrierwave删除文件
【发布时间】:2020-03-19 02:34:26
【问题描述】:

我想设置一个特定的上传器,这样当相关的模型对象被销毁时,亚马逊 s3 上的文件不会被删除。

原因是我的上传模型记录虽然已销毁,但仍然在第二个审计表中引用。

我正在使用雾、载波和 s3。

【问题讨论】:

    标签: ruby-on-rails carrierwave


    【解决方案1】:

    其实有办法做到这一点,你只需要跳过删除它的回调:

    skip_callback :commit, :after, :remove_<column_name>!
    

    例如

    # user.rb
    mount_uploader :avatar
    skip_callback :commit, :after, :remove_avatar!
    

    https://github.com/carrierwaveuploader/carrierwave#skipping-activerecord-callbacks

    【讨论】:

      【解决方案2】:

      AFAIK remove_previously_stored_files_after_update 仅在模型对象为 updated 时有效,因此将其设置为 false 不会在 update 期间删除旧的 file

      但在您的情况下,您必须确保在相关模型对象被销毁时文件仍然存在

      我不认为那里(如果你检查代码here)是Carrierwave 中当前可用的任何机制这样做

      但是你可以覆盖remove! 来达到同样的效果我猜这涉及到设置attr_accessor(这是决定是保留文件还是删除文件的标志)

      在你想要的模型中定义一个attr_accessor(比如keep_file)

      并在所需的上传者中覆盖删除!方法

      class MyUploader < CarrierWave::Uploader::Base 
        def remove!
           unless model.keep_file
             super
           end
        end
      end
      

      并确保在销毁对象之前为对象设置attr_accessor(如果要保留已删除的文件)

      例子

      u = User.find(10)
      u.keep_file = true
      u.destroy 
      

      这将确保在从数据库中删除记录时清理文件

      如果有更好的方法,请告诉我

      希望有帮助

      【讨论】:

        【解决方案3】:

        Keeping files for all, or some uploaders

        CarrierWave.configure do |config|
          config.remove_previously_stored_files_after_update = false
        end
        

        如果您想在每次上传的基础上进行配置:

        class AvatarUploader < CarrierWave::Uploader::Base
          configure do |config|
            config.remove_previously_stored_files_after_update = false
          end
        
          ...
        end
        

        【讨论】:

        • 谢谢戴夫,不幸的是,我已经有了这个,但它不工作。关于它为什么会失败的任何想法,我都在上传器中。
        • @DaveNewton 我不认为它会起作用它只在更新不删除记录的情况下起作用
        【解决方案4】:

        我有一个案例,我需要我的上传器不仅在上传新文件时保存文件,而且在删除记录本身时也保存文件。我发现上面 Dave Newton 和 mkk 建议的组合效果很好:

        在我的上传器中我添加了:

        class AttachmentUploader < CarrierWave::Uploader::Base
          configure do |config|
            config.remove_previously_stored_files_after_update = false
          end
        end
        

        然后在我的模型上添加:

        class Resource < ApplicationRecord
          # Skip the remove callback so the files remain upon deletion of the Resource record
          mount_uploader :attachment, AttachmentUploader
          skip_callback :commit, :after, :remove_attachment!
          ...
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-05
          • 2013-04-29
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多