Как вы можете обновить файл в Ruby on Rails / Paperclip / S3? - PullRequest
1 голос
/ 10 июля 2011

В моем приложении Ruby on Rails используются S3 и Paperclip. У меня есть пользователи загружают текстовый файл, который отлично работает. Я также хочу разрешить им редактировать текстовый файл и сохранять его ... это то, где я запутался. Так как они не загружают повторно какой-либо файл, а редактируют содержимое сохраненного текстового файла. Как я могу это сделать?

Эквивалентно, как создать / сохранить модель с помощью Paperclip, не загружая фактический файл?

Вот кое-что, что я попробовал ...

Source.new(:user_id => 4,
           :name => "untitled.txt",
           :attachment_file_name => "untitled.txt",
           :attachment_content_type => "application/octet-stream",
           :attachment_contents => "This is a sample text file. Edit and resave to change this.")
      .save

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

РЕДАКТИРОВАТЬ: я добавляю награду, которую я буду награждать всем, кто может показать мне, как это сделать, не требуя от пользователя сохранения текстового файла и его повторной загрузки. У меня есть текстовое поле HTML, и я хочу предложить AJAXed кнопку «Сохранить», чтобы сохранить текстовый файл на S3.

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

Похоже, вы смешиваете два концептуально разных подхода: хранилище БД и хранилище файлов. Так что, с моей точки зрения, вы должны выбрать один из двух вариантов:

Вариант 1. Использование хранилища файлов (например, Amazon S3)

Кажется, на этот вопрос основательно ответил Бен Симпсон. Если вы хотите разрешить пользователю редактировать ресурс с файловой поддержкой, то вам необходимо убедиться, что вы «манипулируете содержимым файла на S3 вне Paperclip».

Вариант 2: использование хранилища БД

Мне кажется, это то, чего вы в конечном итоге хотите достичь. Загрузка файла служит точкой входа для созданного пользователем контента в ваше приложение. Поскольку вы имеете дело с простыми текстовыми файлами, я предлагаю сохранить содержимое загруженного файла в вашу модель, которую затем можно обновить, как и любую другую модель (включая сохранение в ajax).

Для начальных значений, т. Е. «Это образец текстового файла. Отредактируйте и сохраните, чтобы изменить это.», Вы можете использовать опцию: default в файле миграции, или если вы настаиваете на наличии физического файла , используйте paperclip: default_url в методе has_attached_file вместе с файлом, содержащим содержимое шаблона.

1 голос
/ 15 июля 2011

Предполагая, что вы используете драгоценный камень aws-s3, вы просто используете API этого драгоценного камня (не скрепку), чтобы обновить файл:

AWS::S3::S3Object.store 's3/path/to/untitled.txt', params[:textarea_contents_params_name], your_bucket_name

0 голосов
/ 10 июля 2011

Поскольку вы работаете с файлом (multipart / form-data), вы не можете отобразить эти данные, используя поля формы HTML. Для того чтобы пользователь «отредактировал» текстовый файл, необходимо загрузить его, внести изменения и сохранить, а затем снова загрузить новый файл.

В действии обновления вашего отвечающего контроллера вам нужно будет обновить атрибуты экземпляра Source новыми параметрами. Этот новый файл приведет к тому, что гем Paperclip перезапишет информацию для старого файла и заменит его новым файлом. Предполагается, что вы используете метод Rails form_for и помощники Paperclip:

# app/controllers/source_controller.rb
class SourceController < ApplicationController
  def update
    @source = Source.find(params[:id])
    @source.update_attributes(params[:source]) # This will overwrite the old file information
  end
end

Скрепка отправит Amazon S3 запрос на удаление старого файла и сохранение нового файла.

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

...