【问题标题】:rails and dynamic javascript?导轨和动态javascript?
【发布时间】:2011-02-06 06:55:46
【问题描述】:

大家好,我正在尝试将最近流行的 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() 它,而记住要摆脱原始数据以避免它干扰 POST 数据。

感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢潘,非常感谢您的回复。我实际上想使用选项 3 来做,但这就是我感到困惑的地方。我会在哪个文件中调用?谢谢!
    • 同时我将尝试选项 2。
    • 要实现选项 #3,您必须在文件上传器页面上使用内联 javascript,并使用 erb 标签插入您的集合选择。例如 javascript_string = "";
    • 对,我的困惑是把它放在哪个文件中,但我想我可以使用脚本标签和 content_for 将它放在同一个视图中:脚本
    • 这听起来对我来说是正确的。您基本上希望将文件上传器表单重新呈现为定义 javascript 的页面。是否使用 content_for 或其他 javascript 标签取决于您,但它应该在同一页面上。
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2017-04-24
    相关资源
    最近更新 更多