我正面临一个纸夹的尴尬问题。调用关联模型的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
答案 0 :(得分:1)
是的,你是。插值应该是可重现的,它们应该为特定控制器的每次调用产生完全相同的值,并且在您的情况下,您将在所有调用中生成随机值。
当对象被破坏时,将再次调用插值,它将生成不同的随机值,并且不会找到此新文件。如果你真的想拥有这个十六进制值,可以在模型中生成并存储它,或者不使用随机使用像摘要这样的散列算法。这是它的样子:
#put this somewhere
require 'digest/md5'
def normalized_photo_file_name
"photo_#{Digest::MD5.hexdigest(self.id.to_s)}"
end
这保证将为所有模型生成相同的值,并且您的destroy方法将正常运行。