回形针破坏附件未删除

时间:2011-08-09 12:45:43

标签: ruby-on-rails ruby paperclip

我正面临一个纸夹的尴尬问题。调用关联模型的destroy方法时。删除数据库记录,但不删除附件文件。 我看过rails服务器日志,我只看到日志“删除附件”,没有删除文件的日志。

我正在使用文件名插值重命名上传的文件(请参阅代码)。 当我删除此插值(从模型中删除:path&:url)时,我注意到destroy方法正常工作。所以我确定根本原因:文件名插值。 我是以错误的方式使用插值吗?它是回形针中的一个已知问题吗?

:path =>       ":rails_root/public/system/:attachment/:id/:style/:normalized_photo_file_name.:extension",
:url => 
"/system/:attachment/:id/:style/:normalized_photo_file_name.:extension" 


  Paperclip.interpolates :normalized_photo_file_name do |attachment, style|
    attachment.instance.normalized_photo_file_name
  end

   def normalized_photo_file_name
     if @rnd.nil? 
        @rnd= SecureRandom.hex(4)  
    end
    "photo_#{@rnd}" 

  end

1 个答案:

答案 0 :(得分:1)

是的,你是。插值应该是可重现的,它们应该为特定控制器的每次调用产生完全相同的值,并且在您的情况下,您将在所有调用中生成随机值。

当对象被破坏时,将再次调用插值,它将生成不同的随机值,并且不会找到此文件。如果你真的想拥有这个十六进制值,可以在模型中生成并存储它,或者不使用随机使用像摘要这样的散列算法。这是它的样子:

#put this somewhere
require 'digest/md5'

def normalized_photo_file_name
    "photo_#{Digest::MD5.hexdigest(self.id.to_s)}" 
end

这保证将为所有模型生成相同的值,并且您的destroy方法将正常运行。