Rails 5 成功发送数据后重新启用表单提交

Posted

技术标签:

【中文标题】Rails 5 成功发送数据后重新启用表单提交【英文标题】:Rails 5 Re-enable form submit after successful send_data 【发布时间】:2017-04-15 11:25:25 【问题描述】:

在我的 Rails 5 应用程序中,表单的默认提交按钮在提交时被禁用,以防止意外的重复提交。每当页面在提交后被重定向或重新呈现时出现验证错误,按钮就会再次启用。

在我的情况下,我让控制器发送一个 zip 文件,我在控制器操作中使用以下命令在内存中构建该文件:

send_data zip.read, filename: "some_file.zip"

但是,在提供文件后,表单并未重新启用。我必须按 ctrl-F5 页面来重置表单并能够做出不同的选择。

rails 的方法是什么?

【问题讨论】:

听起来您可能正在使用 ajax 或 UJS 来发送此表单? 表单是一个普通的form_tag,没有与模型关联。通常,表单提交会呈现一个新页面(或重定向)作为响应。这里通过 send_data 提供一个文件作为响应,但没有重新加载页面,导致 submit_tag 保持禁用状态。 @ChrisDekker 找到解决方案了吗?我有同样的问题。 【参考方案1】:

我遇到了类似的问题并通过使用button_tag 而不是submit_tag 解决了。这不会重新启用表单,但会阻止它被禁用。

【讨论】:

你能举个例子吗?你从中得到了什么行为?对我来说,当文件给出响应时,问题似乎是在客户端捕获事件。我真的不明白使用 button_tag 有什么帮助。 这是因为 button_tag 根本没有触发禁用,这对于您的用例来说可能是可以接受的。它根本不会阻止双击。我遇到的问题有点不同——我的表单是target="_blank",但由于它不会导致任何后端更改,所以双击我的不是问题。【参考方案2】:

看看这种结合客户端和服务器来检测下载事件的方法: Detect when browser receives file download

【讨论】:

【参考方案3】:

您可以通过添加附加 data: disable_with: false 来保持 submit_tag 处于启用状态。

或者在表单提交几秒钟后启用它?

 $("#my_form_id").submit(function()
    setTimeout(() =>
      
      // Enable submit button or enable all
      // $.rails.enableFormElements($($.rails.formSubmitSelector))
      $.rails.enableFormElement($("#my_form_id [type='submit']"))

    , 3000)
  )

【讨论】:

以上是关于Rails 5 成功发送数据后重新启用表单提交的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 为啥远程提交我的表单后 jQuery 不加载

在rails 5中没有页面刷新和重定向的模态表单提交

PHP清除浏览器缓存以避免刷新后重新发送表单数据

Rails/Ajax 在提交后将表单从创建更改为更新

表单提交后如何防止页面重新加载 - JQuery

Java中避免表单重复提交