rails和动态javascript?

时间:2011-02-06 06:55:47

标签: jquery ruby-on-rails ruby ajax paperclip

嘿伙计们,我试图将最近流行的jQuery File Uploader与Rails 3绑在一起(使用Paperclip后端,虽然这与此问题尚不相关)。

这个jQuery插件基本上允许多个文件上传。我正在阅读this page,了解有关如何在每次上传时传递其他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
});

问题在于,根据插件的documentationbuildUploadRow必须返回html,因此我必须获取返回的数据并将其连接到返回结果或其他内容。

一种可能性 是在静态视图中写出一次,然后每当我需要在标记上传时动态添加它,clone()它,同时记得摆脱原文以避免干扰POSTed数据。

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

我认为有几种方法可以解决这个问题:

  1. 将collection_select添加到页面的另一部分,该部分不在您的上传器表单中,并将其隐藏在用户之外(display:none)。保留一个collection_select作为参考,并在想要添加新文件上传行时简单地克隆它。确保将collection_select作为隐藏元素添加到页面的其他区域,以便它也不会被提交。
  2. 使用Rails创建一个collection_select作为第一个文件上传行,然后在需要另一个时简单地克隆第一个。
  3. 使用Rails将collection_select直接插入到页面上的javascript函数中,作为字符串。确保escape_javascript字符串,以便它是有效的Javascript。使用此方法,您的collection_select将已嵌入到buildUploadRow函数中。