在after_filter中根据paperclip上传的文件做相应处理

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的顺序问题。

首发:http://www.holin.info/posts/4c6fe69aff1f011a9a000001

你可能感兴趣的:(F#)