问题点

Rails的Image的models中,使用了paperclip这个Gem来处理图片。近期需要添加一个功能,删除image后,需要向某个email地址发送一封邮件,告之某个图片已经被删除了。

实际操作中,发现在无论函数是定义在before_destroy或after_destroy的callback中,attachment_file_name,attachment_file_size, attachment_content_type, attachment_updated_at的属性,取出来都是nil。

调查了一下,现将结果汇总如下:

解决办法

有两个办法可以解决这个问题:

方法一:

将自己的before_destroy置于 has_attached_file 之前,这样就能够在执行Paperclip的 before_destroy之前执行你的before_destroy的方法,此时相关字段还没有设置为nil,还能访问到.

方法二:

将自己的before_destory置于 has_attached_file 之后,此时Paperclip的before_destroy会先于自己写的before_destroy之前调用,会将相关字段设置为nil。
此时,只能依靠activerecord的_was方法来获取修改前的值, 比如获取attachment_file_name的话,就调用attachment_file_name_was

适用情况

如果要before_destroy中callback中获取以上字段的值,上述两个方法都可行

如果是after_destroy的话,就只能依靠上述的方法二来获取attachment_file_name之类的值

Reference

留言