应用场景:一个组(Group)有多张图片(GroupPicture),图片上传处理我用的是
paperclip插件。我在上传和删除图片时,顺便在Group中更新一下Group的空间使用情况,我使用Group的after_save和before_destroy。
上代码:
# RAILS_GEM_VERSION = '2.2.2'
class GroupPicture < ActiveRecord::Base
belongs_to :group
has_attached_file :picture, :styles => {:thumb => "120x90>" },
:path => ":rails_root/public/uploads/:class/:attachment/:id/:style/picture.:extension",
:url => "/uploads/:class/:attachment/:id/:style/picture.:extension",
:default_url => "/uploads/:class/:attachment/:style/missing.jpg"
validates_attachment_size :picture, :less_than => 1.megabyte
after_save :add_group_file_size # 更新群组空间使用情况
before_destroy :reduce_group_file_size # 更新群组空间使用情况
private
# 更新所在群组空间使用情况
# for after_save
def add_group_file_size
if self.picture_file_size
self.group.group_file_size += self.picture_file_size
self.group.save(false)
end
end
# 更新群组空间使用情况
# for before_destroy
def reduce_group_file_size
if self.picture_file_size
self.group.group_file_size -= self.picture_file_size
self.group.save(false)
end
end
end
上面的代码 你觉得有什么问题吗?结果会如人愿吗?不会,在删除图片后,Group的空间使用情况还是原样,
在方法reduce_group_file_size头中输出self.picture_file_size,是空的,什么也没有!
怎么会这样呢?我试着在方法reduce_group_file_size头中输出group_picture的其它属性,如title,created_at之类的,是有值的,为什么就是picture_file_size空空如也???
解决方法:
将代码:
after_save :add_group_file_size # 更新群组空间使用情况
before_destroy :reduce_group_file_size # 更新群组空间使用情况
放在
has_attached_file :picture, :styles => {:thumb => "120x90>" },
:path => ":rails_root/public/uploads/:class/:attachment/:id/:style/picture.:extension",
:url => "/uploads/:class/:attachment/:id/:style/picture.:extension",
:default_url => "/uploads/:class/:attachment/:style/missing.jpg"
validates_attachment_size :picture, :less_than => 1.megabyte
的前面就解决问题了。
真是诡异。