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 成功发送数据后重新启用表单提交的主要内容,如果未能解决你的问题,请参考以下文章