Paperclip是很方便的处理上传附件的插件,三下两下就为应用增加上传文件功能。
我有个应用场景是在文件上传后,得到文件的行数并保存下来。于是我增加了一个after_filter:
after_save :set_item_count
attr_accessor :no_after_save_filter
def set_item_count
return if @no_after_save_filter
return if self.asset.path.nil?
if File.exist?(self.asset.path)
File.open(self.asset.path, "r") do |f|
@no_after_save_filter = true
self.item_count = f.readlines.size
self.save
end
end
end
has_attached_file :asset
但在新增的时候老是不能正确设置item_count,在更新的时候才能正确处理。通过查看日志,发现set_item_count总是在保存文件之前被调用,所以执行set_item_count的时候文件还不存在,自然就不能正确设置item_count了。
折腾了半天还是没能搞定,就在差点放弃的时候,想到了一个办法,那就是:把has_attached_file :asset 移到 after_save :set_item_count之前,也就是:
has_attached_file :asset
after_save :set_item_count
attr_accessor :no_after_save_filter
def set_item_count
return if @no_after_save_filter
return if self.asset.path.nil?
if File.exist?(self.asset.path)
File.open(self.asset.path, "r") do |f|
@no_after_save_filter = true
self.item_count = f.readlines.size
self.save
end
end
end
Ok,搞定。 其实就是filter的顺序问题。