【问题标题】:Nested forms, inline uploads, and progress bars with Carrierwave in Rails在 Rails 中使用 Carrierwave 的嵌套表单、内联上传和进度条
【发布时间】:2011-08-18 23:27:34
【问题描述】:

对于 Rails 中的嵌套表单、多文件上传和进度条,我有相当深奥的用例。到目前为止,我还没有找到任何关于此的在线讨论。如果我忽略了什么,我很抱歉。请纠正我。

这就是我想要的:

  1. 给定的表单有多个动态字段。其中之一是“附加文件”。
  2. 对于这个“附加文件”,我想要一个本质上类似于 gmail 的界面。
  3. 该界面使您能够:
    1. 点击“附加文件”。
    2. 选择一个本地文件,它会立即在后台开始上传,同时为您提供一个进度条。
    3. 这允许您编写消息或添加更多文件。
    4. 您可以取消实时上传,甚至可以在事后通过取消选中某个框来删除附件。

以下是我正在使用的模型和关联。

  1. 我有一个模型 Recording,它有很多 AudioFiles。
  2. 每个 AudioFile 都包含音频数据,以及大小、类型、创建日期等元数据。
  3. 一个录音还有其他几个子集合。

以下是“创建录音”表单的行为方式:

  1. 它应该允许用户添加多个子字段,包括多个音频文件..
  2. 到目前为止,我正在使用出色的嵌套表单 (https://github.com/ryanb/nested_form) gem 来创建录音的非 AudioFile 子项。 IT 工作非常出色。
  3. 我想要的是能够有类似的嵌套字段来异步上传多个音频文件,带有进度指示器,并且能够取消或删除上传的文件。

有许多资源演示了如何将上传器与carrierwave 结合使用来存储带有进度信息的文件。例如,https://github.com/yortz/carrierwave_jquery_file_uploadhttps://github.com/blueimp/jQuery-File-Upload/wiki/Rails-setup-for-V5

本质上,这些示例的作用是从这些上传器之一生成请求,该请求被定向到控制器为模型创建操作,该模型附加了载波上传器。我有这么多工作要做。

我不知道如何在嵌套表单上下文中执行此操作。棘手的地方是:

  1. 假设我编写了 AJAX 以从“创建录音”表单中发布帖子,并让该帖子创建新的 AudioFile 记录。如何将该音频文件与尚未创建的录音相关联?
  2. 如果用户中止事务,那么创建的 AudioFile 记录将如何被清理?

我可以想到实现上述两个方面的 hacky 方法,但我想知道是否有更优雅的方法。我对 Rails 比较陌生,所以我猜我没有充分利用它。

谢谢, 阿普尔瓦

【问题讨论】:

    标签: ruby-on-rails progress-bar nested-forms carrierwave


    【解决方案1】:

    我想通过分享我如何解决这个问题来回馈社区。

    总而言之,主要问题是协调 CarrierWave 的行为、嵌套表单和文件上传的细粒度控制。

    问题的症结在于嵌套表单在对根控制器的#create 操作的单个 POST 操作中创建根记录及其所有关联。

    在上面的示例中,Recording 模型是根,而 AudioFile、Note 和 Categorization 是要与 Recording 一起创建的关联。

    因此,对于嵌套表单,我必须在单个 POST 中创建所有这些记录,这将排除单独取消上传或与添加其他字段(如 Notes)并行上传的可能性。

    这不会带来良好的用户体验。我的解决方案非常简单:

    1. 我选择不使用嵌套表单。
    2. Recording#create 将总是以空参数调用。 Recording 属性将在创建操作中获得合理的默认值。
    3. 用户只会看到 Recording#edit 页面。
    4. 在 Recording#edit 页面上,我对关联模型上的 CRUD 操作有独立的控制,这些操作将通过 AJAX 调用路由到不同的控制器。这很有效,因为每个关联模型都有一个有效的recording_id 可供使用。
    5. 各种控制器将返回 HTML 片段,这些片段将写入主记录页面。

    这启用了“记录”页面上所有字段的内联编辑,即使这些字段映射到不同(关联)模型。因此,用户将能够上传多个文件、在上传时添加注释、播放已上传的文件以及随意取消上传。

    因此,整个用户体验更加流畅。根据定义,使用嵌套表单永远无法实现这一点。

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多