2011-10-19 16 views
1

私はペーパークリップを使用して鉱山のモデルにファイルを添付しています。私がしたいのは、モデルが保存され、ファイルがディスクに書き込まれた後、ファイルに関する別の属性(CRC)を更新する必要があるということです。 paperclipは.saveが呼び出されるまで、ファイルをディスクに書き込まないので、私の最初の考えはafter_saveコールバックを使用することでした。私がこれを行うと、私は "SystemStackError(スタックレベルが深すぎる):"エラーが発生します。それから、少しうまく動いているように思えるafter_commitコールバックを試みました。たとえば、私は単純に自分のcrcを割り当てる:保存後にレコードを更新するタイミングは?

self.crc = "TEST" 
self.save 

これは動作します。しかし、私はこれで、私の本当の割り当てを実行しようとした場合:

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?をご覧ください。特定の条件でコールバックをスキップするためのヒントです。

編集:

あなたはまた、独自のペーパークリップのポストプロセッサを書きたいかもしれません。 Readmeの「Post Processing」と「Custom Attachment Processor」のセクションを見て、既存のプロセッサの動作を確認するコードを調べてください。

https://github.com/thoughtbot/paperclip

+0

さて、私は見てみましょう。別の問題は、ディスクに保存する前にファイルの内容にアクセスする方法があるかどうかです。その場合、私はこれをする必要はありません。 –

+0

申し訳ありませんが、私は ':if =>:skip_callback'を使って条件付きコールバックを処理して、crcがnilかどうかを調べるskip_callbackメソッドを持っています。 –

関連する問題