我正在做一个需要接受文件上传的项目。文件上传后,我正在做一些处理——从文件中提取信息。我最终计划在后台工作人员中运行它,但它目前正在内联运行。
我试过同时使用 after_create 和 after_save 来处理文件,但似乎我的方法是在 Paperclip 的 save 方法之前运行的 - 所以我的测试失败,“没有这样的文件或目录”。
有什么方法可以提前触发保存方法,或者在文件保存到文件系统后以某种方式运行我的方法?
我正在做一个需要接受文件上传的项目。文件上传后,我正在做一些处理——从文件中提取信息。我最终计划在后台工作人员中运行它,但它目前正在内联运行。
我试过同时使用 after_create 和 after_save 来处理文件,但似乎我的方法是在 Paperclip 的 save 方法之前运行的 - 所以我的测试失败,“没有这样的文件或目录”。
有什么方法可以提前触发保存方法,或者在文件保存到文件系统后以某种方式运行我的方法?
您无法在回调中读取回形针文件,因为它尚未保存到文件系统(或对接)。为什么,我不太确定。
编辑: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 分钟前这样做。希望这可以帮助。
添加此答案以提高知名度。@Jonmichael Chambers 在此线程中的先前评论为我解决了这个问题。
将回调从after_save
/更改after_create
为after_commit
我认为问题可能与回调的顺序有关。
正如在其他答案中所讨论的,附件文件确实after_save
在回形针中定义的回调中物理保存到磁盘,该回调在调用点添加到模型类中 has_attached_file
。
因此,您必须after_save
确保在.has_attached_line
注意:after_create
回调确实根本不能使用,因为它之前被调用过after_save
。
看看 Paperclip 后处理事件回调。您应该可以调用after_post_process
来提取额外的文件信息。