2016-03-08 2 views
1

Мне нужно получить доступ к URL из вложения когда загрузка, как таковой, я должен определить метод after_flush_writes как предлагается здесь https://github.com/thoughtbot/paperclip/issues/816Override Скрепка: метод Attachment

Как я могу добиться этого?

До сих пор я сделал это, но он не работает:

class ExcelFile < ActiveRecord::Base 
    belongs_to :insertion 
    has_attached_file :excel 
    validates_attachment_content_type :excel, content_type: [ "application/vnd.ms-excel", 
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
        "application/msword", 
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"] 


    def after_flush_writes 
    super 
    byebug 
    file = Roo::Excelx.new(self.excel.url(:original, timestamp: false)) 
    input_from_generals self.id, file 
    input_from_financials self.id, file 
    end 

Я пытался использовать after_commit, after_create обратных вызовов, чтобы иметь возможность получить доступ к self.excel.url, но он не работает.

+0

'after_flush_writes' должен быть определен в контексте' Paperclip :: Attachment class', иначе он не будет вызываться. Однако мои тесты показывают, что простые обратные вызовы 'after_create' или' after_save' работают нормально - вы должны иметь возможность использовать 'url' внутри этих обратных вызовов. – BoraMa

+0

Спасибо! @BoraMa Я не могу сделать это с помощью after_create или after_save, и я думаю, что это потому, что скрепка выписывает файл через обратный вызов after_save. – Mario

+0

Мой вопрос похож на этот http://stackoverflow.com/questions/19960471/paperclip-running-a-method-after-the-file-is-saved, но я не знаю, как они решили проблему. – Mario

ответ

1

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

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

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

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

+0

Он работает с after_save и префиксом «public» в URL-адресе. – Mario

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