2011-10-19 82 views
1

我使用回形針將文件附加到我的模型。我想要做的是,在保存模型並將文件寫入磁盤之後,我需要更新模型中關於文件(CRC)的另一個屬性。由於paperclip在調用.save之前不會將文件寫入磁盤,我首先想到的是使用after_save回調。當我這樣做時,我得到一個「SystemStackError(堆棧級別太深):」錯誤。然後,我試圖做一個after_commit回調,似乎工作更好一點。例如,如果我簡單地將我的crc分配給:保存後何時更新記錄?

self.crc = "TEST" 
self.save 

This works。但是,如果我嘗試做我真正的分配,與此:

self.crc = "0x" + IO.read(self.patchfile.path, 4, 0x20).unpack("H8").join 
self.save 

的WEBrick中止與:

/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x180048) [0x290048] 
/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_yield+0x56) [0x294c46] 

[NOTE] 
You may have encountered a bug in the Ruby interpreter or extension libraries. 
Bug reports are welcome. 
For details: http://www.ruby-lang.org/bugreport.html 

Aborted 

所以我想我這樣做不對...

+0

我應該提到,雖然它殺死WEBrick,但它確實有效。當我重新啓動時,CRC屬性設置正確。另外,在上面列出的錯誤中,還有更多,我只是貼出了尾部。 –

回答

5

你」在after_save回調中,並且您打電話給save。這會再次觸發你的回調,這是你的無限循環「堆棧層太深」錯誤來自的地方。

考慮使用從回調中排隊的DelayedJob。讓後臺任務處理分配CRC的工作。但是,您仍然會發生無限循環,但這次是無限循環的排隊作業。

看一看:How can I avoid running ActiveRecord callbacks?關於在特定條件下跳過回調的提示。

編輯:

您可能還需要編寫自己的回形針後處理器。閱讀自述文件中的「後期處理」和「自定義附件處理器」部分,並深入瞭解代碼,以瞭解現有處理器的運行方式。

https://github.com/thoughtbot/paperclip

+0

好的,我會看看。另一個問題是,有沒有辦法在文件保存到磁盤之前訪問文件內容?在這種情況下,我不需要這樣做。 –

+0

好的,我使用':if =>:skip_callback'獲得了條件回調的工作方式,然後有一個skip_callback方法來檢查crc是否爲零。 –

相關問題