2013-11-13 4 views
9

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

Я попытался использовать как after_create, так и after_save для обработки файла, но кажется, что мой метод запускается до метода save из Paperclip - поэтому мои тесты терпят неудачу с «Нет такого файла или каталога».

Есть ли способ запустить метод сохранения раньше или каким-то образом запустить мой метод после того, как файл был сохранен в файловой системе?

ответ

5

Вы не можете прочитать файл paperclip в обратном вызове, поскольку он еще не сохранен в файловой системе (или прикладе). Почему, я не совсем уверен.

EDIT: Причина в том, что paperclip выписывает файл через обратный вызов 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 минуты назад. Надеюсь это поможет.

+2

Как я могу сделать изображение? Когда вы загружаете изображение с помощью paperclip, тогда вы хотите отправить электронное письмо после создания записи, но не получите такую ​​ошибку файла. Я хочу отправить электронное письмо с приложением этого изображения. Что мне нужно сделать? – user1780370

+0

У меня такая же проблема @ user1780370. Вы нашли решение? – Mario

+0

Я не сделал после этого, потому что некоторые требования меняются. – user1780370

0

Взгляните на почтовую обработку Paperclip events. Вы можете позвонить after_post_process, чтобы выполнить экстренное извлечение информации о файле.

+1

Спасибо за ответ. Я пробовал after_post_process, но у меня все еще такая же проблема. "Данный файл или каталог отсутствует". Если я полностью удалю всю проверку, я вижу, что файл сохраняется в какой-то момент - но, возможно, не во время вызова after_post_process. Редактировать: Scratch, что, кажется, я понял. Благодаря! –

+0

Ух, неважно. Я ошибался. Когда я использую метод, который ожидает, что Файл будет сохранен уже, он все еще бросает «не найденные» ошибки. : | –

+4

Я нашел, что мне удалось запустить мой метод из after_commit .. но это действительно лучший способ сделать это? Кажется, файл сохраняется до этой точки. –

2

Добавление этого ответа для видимости. Предыдущий комментарий @Jonmichael Chambers в этой теме решил проблему для меня.

Изменение обратного вызова от after_save/after_create к after_commit

1

Я думаю, что проблема может быть связана с порядком обратных вызовов.

Как обсуждалось в других ответах, файл вложения действительно физически сохраняется на диск в after_savecallback defined in Paperclip, который добавляется к классу модели в точке has_attached_file.

Таким образом, вы должны убедиться, что ваши собственные after_save обратные вызовы (которые хотят иметь дело с загруженного файла) определены послеhas_attached_line.

Примечание: обратный вызов after_create действительно не может использоваться вообще, поскольку он вызывается до after_save.

Смежные вопросы