Как использовать Paperclip без файла, просто с помощью строки?

У меня есть файл rake, который читает содержимое через HTTP, и я хочу использовать программу "Скрепка" для хранения загруженного контента на Amazon S3. Он отлично работает, когда я предоставляю локальный файл, но я хотел бы установить содержимое в виде строки и установить тип содержимого вручную.

Не работает следующее. Ошибка не выдается, запись базы данных обновляется, но файл S3 не создается:

p.attachment = "Test"
p.attachment_file_name = "test.txt"
p.attachment_content_type = "text/plain"
p.attachment_file_size = "Test".size
p.attachment_updated_at = Time.now
p.save

Думаю, я мог бы написать временный файл с моим контентом, но это было бы довольно неэффективным решением.

Ответы

Ответ 2

Чтобы избежать засорения файловой системы временными файлами, вы можете использовать StringIO, как в:

p.attachment = StringIO.new(your_string)

Ответ 3

Немного поздно, но я отключил его, создав Tempfile, используя ruby ​​1.9.2 rails 3.1

file = Tempfile.new( ["file_name", '.txt'] )
file.write( "my test string".force_encoding('utf-8') )
p.attachment = file

Ответ 4

Как для скрепки, так и для carierwave я создаю такой класс. У этого есть оба метода, необходимые для издевательства загрузки файла, который они любят видеть.

class FakeFileIO < StringIO
  attr_reader :original_filename
  attr_reader :path

  def initialize(filename, content)
    super(content)
    @original_filename = File.basename(filename)
    @path = File.path(filename)
  end
end

Работает как сон

Ответ 5

Подобно Aarons, но с соответствующим блочным методом, предложенным Ruby:

... всегда нужно вызвать unlink или закрыть в блоке обеспечения.

file = Tempfile.new('test.txt')

begin
  file.write( "Test" )

  p.attachment = file
  p.save              

  # Whatever else you might need to do with the TempFile.

ensure
  file.close
  file.unlink   # Deletes the temp file.
end