2009-07-29 3 views
3

Есть ли лучший способ сохранить некоторую строку в качестве вложения с помощью Paperlip в качестве файла tmp, вставив в нее строку, снова открыв ее и сохранив ее как вложение?Скрепка для скрепки скрепки

Как это:

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

Почему, черт возьми, вы хотите это сделать? – Lichtamberg

ответ

0

Скрепка хранит файлы вместе с вашими моделями - это то, что было написано, чтобы сделать, так что я думаю, короткий ответ «нет».

Если вы посмотрите в в источнике скрепки, вы увидите метод под названием def assign uploaded_file. Если вы посмотрите на реализацию этого метода, вы увидите, что он ожидает, что загруженный файловый объект будет иметь определенные методы, определенные на нем.

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

4

На самом деле есть лучший способ - вы можете обернуть его в StringIO, который скрепляет скрепки, и вы получите псевдо-загруженный файл в кратчайшие сроки. Вы можете настроить его, указав методы экземпляра или непосредственно создать подкласс StringIO следующим образом:

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 

Наслаждайтесь!

+0

Как это работает с ActionMailer? – TheExit

+0

Я искал что-то вроде этого. Но как это работает с скрепкой? Как взять приложение электронной почты из ActionMailer, а затем отправить вложение (с помощью StringIO) в скрепку? – TheExit