加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails中使用Carrierwave的嵌套表单,内联上传

发布时间:2020-12-17 02:15:49 所属栏目:百科 来源:网络整理
导读:我对Rails中的嵌套表单,多文件上传和进度条有相当深奥的用法.到目前为止,我还没有找到关于此的任何在线讨论.如果我忽略了什么,我很抱歉.请指正. 这就是我想要的: 给定表单具有多个动态字段.其中一个是“附加文件”. 对于这个’附加文件’,我想要一个基本类
我对Rails中的嵌套表单,多文件上传和进度条有相当深奥的用法.到目前为止,我还没有找到关于此的任何在线讨论.如果我忽略了什么,我很抱歉.请指正.

这就是我想要的:

>给定表单具有多个动态字段.其中一个是“附加文件”.
>对于这个’附加文件’,我想要一个基本类似于gmail的界面.
>该界面使您能够:

>点击“附加文件”.
>选择一个本地文件,该文件立即开始在后台上传,同时为您提供进度条.
>这允许您编写消息,或添加更多文件.
>您可以通过取消选中框来取消实时上传甚至删除附件.

以下是我正在使用的模型和协会.

>我有一个模型录音,其中有许多AudioFiles.
>每个AudioFile包含音频数据,以及大小,类型,创建日期等元数据.
> A Recording还有其他几个儿童收藏品.

以下是“创建录制”表单的行为:

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

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

本质上,这些示例所做的是从这些上传者之一生成请求,该请求被定向到控制器创建动作,该模型具有附加到其上的载波上传器.我有这么多工作可以.

我无法弄清楚的是如何在嵌套的表单上下文中执行此操作.棘手的是:

>假设我编写了AJAX来从“创建录制”表单发帖,并让该帖子创建一个新的AudioFile记录.如何将该音频文件与尚未创建的录音相关联?
>如果用户中止事务,那么如何清除如此创建的AudioFile记录?

我可以想到做上述两种方法的hacky方法,但我想知道是否有更优雅的方法.我对rails很新,所以我猜我没有充分利用它.

谢谢,
Apurva

解决方法

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

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

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

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

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

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

>我选择不使用嵌套表格.
>记录#create将始终使用空参数调用. Recording属性将在create操作中获得合理的默认值.
>用户只能看到录制#编辑页面.
>在Recording#edit页面上,我对相关模型上的CRUD操作有独立控制,这些操作将通过AJAX调用路由到不同的控制器.这很有效,因为每个关联的模型都有一个有效的recording_id来使用.
>各种控制器将返回将写入主录制页面的HTML片段.

这样就可以在“录制”页面上对所有字段进行内联编辑,即使这些字段映射到不同(关联)的模型也是如此.因此,用户可以上传多个文件,在上传时添加注释,回放已经上传的文件,以及随意取消上传.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读