когда обновить запись после сохранения? - PullRequest
1 голос
/ 19 октября 2011

Я использую скрепку для прикрепления файлов к моей модели. То, что я хотел бы сделать, это то, что после того, как модель была сохранена и файл записан на диск, мне нужно обновить другой атрибут в моей модели относительно файла (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

Так что я думаю, что я делаю это неправильно ...

1 Ответ

5 голосов
/ 19 октября 2011

Вы находитесь в after_save обратном вызове, и вы звоните save.Это снова вызовет ваш обратный вызов, и именно отсюда исходит ошибка бесконечного цикла «слишком большой уровень стека».

Подумайте об использовании DelayedJob, который вы ставите в очередь из вашего обратного вызова.Позвольте фоновой задаче справиться с работой по назначению вашего CRC.Тем не менее, у вас все еще будет бесконечный цикл, но на этот раз бесконечный цикл заданий в очереди.

Посмотрите на: Как можно избежать выполнения обратных вызовов ActiveRecord? для подсказок поПропуск ваших обратных вызовов при определенных условиях.

Редактировать:

Возможно, вы также захотите написать свой собственный постпроцессор Paperclip.Взгляните на разделы «Постобработка» и «Процессоры пользовательских вложений» в файле readme и пролистайте код, чтобы увидеть, как работают существующие процессоры.

https://github.com/thoughtbot/paperclip

...