Ich möchte empfangene E-Mail-Anhänge unter Verwendung von Büroklammern speichern. Von E-Mail bekomme ich part.body und ich habe keine Ahnung, wie man es in ein Büroklammermodell bringt. Momentan erstelle ich eine temporäre Datei und schreibe port.body dazu, speichere diese Datei in Büroklammer und lösche die Datei. Hier ist, wie ich es mit der temporären Datei mache:
%Vor%: asset ist mein 'has_attached_file'-Feld. Gibt es eine Möglichkeit, die Erstellung von Dateien wegzulassen und so etwas zu tun:: asset = & gt; part.body in Asset.new?
So würde ich es tun, vorausgesetzt, Sie verwenden das Mail-Juwel , um die E-Mail zu lesen. Sie werden die ganze E-Mail "Teil" brauchen, nicht nur part.body
%Vor%Verwenden Sie jetzt einfach das Dateiobjekt, um es in der Paperclip-Zuordnung zu speichern.
%Vor%Hoffe, das hilft.
Barlows Antwort ist gut, aber es ist effektiv, die StringIO-Klasse zu manipulieren. In meinem Fall arbeitete ich mit Mechanize :: Download # body_io und ich wollte die Klasse möglicherweise nicht verschmutzen, was zu unerwarteten Fehlern führte, die weit entfernt in der App auftauchten. Also definiere ich die Methoden in der Instanzen-Metaklasse wie folgt:
%Vor%Ich mag die Antwort von gtd sehr, aber es kann einfacher sein.
%Vor%Es ist nicht wirklich notwendig, die "Metaklasse" in eine lokale Variable zu extrahieren, sondern einfach eine Klasse an das Objekt anzuhängen.
Ab Ruby 1.9 können Sie StringIO und define_singleton_method:
verwenden %Vor%Ich benutzte eine ähnliche Technik, um Bilder in Büroklammer zu ziehen
Das sollte funktionieren, aber es wird nicht getestet:
%Vor%Wenn wir das IO direkt der Paperclip-Instanz zuweisen, muss es einen .original_file_name haben, also tun wir das in der zweiten Zeile.
Tags und Links ruby-on-rails stream paperclip