Paperclip - 保存文件后运行方法?

时间:2013-11-13 17:31:02

标签: ruby-on-rails ruby-on-rails-4 paperclip

我正在开发一个需要接受文件上传的项目。上传文件后,我正在进行一些处理 - 从文件中提取信息。我最终计划在后台工作程序中运行它,但它当前正在内联运行。

我已经尝试使用after_create和after_save来处理文件,但似乎我的方法在Paperclip的save方法之前运行 - 所以我的测试失败了“没有这样的文件或目录”。

有没有办法尽早触发save方法,或者在文件保存到文件系统后以某种方式运行我的方法?

4 个答案:

答案 0 :(得分:7)

您无法在回调中读取paperclip文件,因为它尚未保存到文件系统(或对接)。为什么,我不太确定。

编辑:原因是回形针通过after_save回调写出文件。该回调发生在after_create

之后

但是,您可以获取文件有效负载以进行处理。例如:

class Foo < ActiveRecord::Base

  has_attached_file :csv

  after_create :process_csv

  def process_csv
    CSV.parse(self.csv.queued_for_write[:original].read)
    # .. do stuff
  end

end

我必须在2分钟前做到这一点。希望这会有所帮助。

答案 1 :(得分:3)

添加此答案以提高可见性。 @Jonmichael Chambers先前在这个帖子中的评论为我解决了这个问题。

将回调从after_save / after_create更改为after_commit

答案 2 :(得分:1)

我认为问题可能与回调的顺序有关。

正如其他答案中所讨论的那样,附件文件确实在after_save callback defined in Paperclip中物理保存到磁盘,并在has_attached_file调用时添加到模型类中。

因此,您必须确保自己的after_save回调(想要处理上传的文件)在<{strong> has_attached_line之后定义。

注意:after_create回调确实无法使用,因为在after_save之前调用它。

答案 3 :(得分:0)

查看Paperclip后期处理events回调。您应该可以致电after_post_process进行额外的文件信息提取。