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
4

2 回答 2

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

享受!

于 2010-10-07T13:17:09.207 回答
0

Paperclip 将文件与模型一起存储——这就是它的编写目的,所以我认为简短的回答是“不”。

如果您查看attachment.rbPaperclip 源代码,您会看到一个名为def assign uploaded_file. 如果您查看此方法的实现,您会发现它希望上传的文件对象具有在其上定义的某些方法。

您可以创建自己的类,该类遵循与 Paperclip 期望的相同界面,但老实说,您保存文件并将其分配给 Paperclip 的解决方案可能是最简单的方法。

于 2009-08-03T15:17:28.377 回答