9

我正在做一个需要接受文件上传的项目。文件上传后,我正在做一些处理——从文件中提取信息。我最终计划在后台工作人员中运行它,但它目前正在内联运行。

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

有什么方法可以提前触发保存方法,或者在文件保存到文件系统后以某种方式运行我的方法?

4

4 回答 4

7

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

编辑: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 分钟前这样做。希望这可以帮助。

于 2015-01-29T21:34:00.310 回答
3

添加此答案以提高知名度。@Jonmichael Chambers 在此线程中的先前评论为我解决了这个问题。

将回调从after_save/更改after_createafter_commit

于 2015-12-30T06:09:01.697 回答
1

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

正如在其他答案中所讨论的,附件文件确实after_save 在回形针中定义的回调中物理保存到磁盘,该回调在调用点添加到模型类中 has_attached_file

因此,您必须after_save确保.has_attached_line

注意:after_create回调确实根本不能使用,因为它之前被调用过after_save

于 2016-03-09T10:41:49.923 回答
0

看看 Paperclip 后处理事件回调。您应该可以调用after_post_process来提取额外的文件信息。

于 2013-11-13T18:40:38.287 回答