рельсы и динамический JavaScript? - PullRequest
1 голос
/ 06 февраля 2011

Эй, ребята, я пытаюсь связать недавно популярный jQuery File Uploader с Rails 3 (с бэкэндом Paperclip, хотя это еще не относится к этому вопросу).

Этот плагин jQuery в основном позволяет загружать несколько файлов. Я читал эту страницу для получения информации о том, как передавать дополнительные данные POST при каждой загрузке. Вот где у меня проблемы. Вот код, который страница дает в качестве примера:

  $('.upload').fileUploadUI({
      uploadTable: $('.upload_files'),
      downloadTable: $('.download_files'),
      buildUploadRow: function (files, index) {
          var file = files[index];
          return $(
              '<tr>' +
              '<td class="file_upload_start">' +
              '<div class="ui-state-default ui-corner-all ui-state-hover" title="Start Upload">' +
              '<span class="ui-icon ui-icon-circle-arrow-n">Start Upload<\/span>' +
              '<\/div>' +
              '<\/td>' +
              '<td>' + file.name + '<\/td>' +
              '<td class="file_upload_desc"><input type="text" title="File description"><\/td>' +
              '<td class="file_upload_progress"><div><\/div><\/td>' +
              '<td class="file_upload_cancel">' +
              '<div class="ui-state-default ui-corner-all ui-state-hover" title="Cancel">' +
              '<span class="ui-icon ui-icon-cancel">Cancel<\/span>' +
              '<\/div>' +
              '<\/td>' +
              '<\/tr>'
          );
      },
      // ...

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

f.collection_select :category_id, Category.all, :id, :name

Это работает в статическом представлении, но мне нужно добавлять его каждый раз, когда файл выбран для загрузки.

Моя путаница заключается в том, где и как управлять передачей динамического раскрывающегося списка (динамического, поскольку он зависит от знания, какие категории существуют) в статическое представление.

Будет ли это как-то связано с созданием некоторого частичного представления, затем сделайте что-то вроде:

$.get("/partial", function(data) {
  // blah blah
});

Проблема в том, что согласно документации плагина , buildUploadRow должен возвращать html, поэтому мне придется получить возвращенные данные и объединить их с возвращаемым результатом, или что-то в этом роде.

Одна возможность состоит в том, чтобы один раз записать это в статическом представлении, а затем всякий раз, когда мне нужно добавить его динамически, когда загрузка отмечена, clone() это, при этом запоминая избавьтесь от оригинала, чтобы он не мешал отправленным данным.

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 06 февраля 2011

Я думаю, что есть несколько способов сделать это:

  1. Добавьте collection_select к другой части вашей страницы, которой нет в форме загрузки, и скрыв ее от пользователя (отображение: нет). Сохраните этот один collection_select в качестве ссылки и просто клонируйте его, когда вы хотите добавить новую строку загрузки файла. Убедитесь, что вы добавили collection_select в качестве скрытого элемента в другой области вашей страницы, чтобы он также не отправлялся.
  2. Создайте один collection_select в качестве первой строки загрузчика файлов с помощью Rails, а затем просто клонируйте первый, когда вам понадобится другой.
  3. Используйте Rails, чтобы вставить collection_select непосредственно в функцию javascript в виде строки на вашей странице. Убедитесь в том, что escape_javascript является строкой, так что это допустимый Javascript. Используя этот подход, ваш collection_select уже будет встроен в функцию buildUploadRow.
...