2009-07-29 9 views
3

Existe-t-il un meilleur moyen d'enregistrer une chaîne en pièce jointe via Paperlip en créant un fichier tmp, en y mettant la chaîne, en l'ouvrant à nouveau et en l'enregistrant en pièce jointe?Paperclip save attachment

Comme ceci:

def save_string data 
    tmp_file = "/some/path" 
    File.open(tmp_file,'w') do |f| 
     f.write(data) 
    end 

    File.open(tmp_file,'r') do |f| 
     ceneo_xml = f 
     save! 
    end 
    end 
+1

pourquoi diable voulez-vous faire ça? – Lichtamberg

Répondre

0

magasins Paperclip fichiers à côté de vos modèles - c'est ce qu'il a été écrit pour le faire, donc je pense que la réponse est « non ». Si vous regardez attachment.rb dans la source Paperclip, vous verrez une méthode appelée def assign uploaded_file. Si vous regardez l'implémentation de cette méthode, vous pouvez voir qu'elle s'attend à ce que l'objet de fichier téléchargé ait certaines méthodes définies dessus.

Vous pourriez créer votre propre classe qui suivrait la même interface que celle attendue par Paperclip, mais pour être honnête, votre solution consistant à enregistrer un fichier et à l'affecter à Paperclip est probablement l'approche la plus simple.

4

Il existe en fait un meilleur moyen - vous pouvez l'intégrer à StringIO, qui est amélioré par Paperclip et vous obtiendrez un pseudo fichier téléchargé en un rien de temps. Vous pouvez le personnaliser en définissant des méthodes d'instance ou directement créer une sous-classe de StringIO comme ceci

class InvoiceAttachment < StringIO 
def initialize(invoice, content) 
    @invoice = invoice 
    super(content) 
end 

def original_filename 
    from = @invoice.from 
    to = @invoice.to 
    date = @invoice.created_at.strftime('%B-%Y').downcase 
    "invoice_#{date}_from_#{from}_to_#{to}.pdf" 
end 

def content_type 
    'application/pdf' 
end 
end 

Enjoy!

+0

Comment cela fonctionne avec ActionMailer? – TheExit

+0

Je cherchais quelque chose comme ça. Mais comment cela fonctionne avec un trombone? Comment puis-je prendre une pièce jointe à un courrier électronique à partir d'ActionMailer, puis envoyer la pièce jointe (avec StringIO) à un trombone? – TheExit

Questions connexes