我有一个生成 pdf 并将其提供给用户的 form_tag。最终的 send_data 是这样的:
send_data pdf.render, type: 'application/pdf', :filename => filename, :compress => true
这适用于标准表单,但当我尝试使用 ajax 设置时它不起作用:remote => true。
我想做的最终事情是使用 :disable_with 在生成 pdf 时禁用按钮。
关于我如何解决这个问题的任何想法?
我有一个生成 pdf 并将其提供给用户的 form_tag。最终的 send_data 是这样的:
send_data pdf.render, type: 'application/pdf', :filename => filename, :compress => true
这适用于标准表单,但当我尝试使用 ajax 设置时它不起作用:remote => true。
我想做的最终事情是使用 :disable_with 在生成 pdf 时禁用按钮。
关于我如何解决这个问题的任何想法?
我知道这是一个旧线程,但我想我会让你知道我是如何让它工作的,以防其他人像我一样在这里找到方法。
将 ajax 用于请求的问题是响应(pdf 文件)几乎无法处理,然后作为文件提供给用户,所以不要打扰。相反,我使用内置缓存的 Rails 来获取生成后的 pdf。
一旦您的链接“按常规”工作,请将其添加:remote => true, :disable_with => 'loading...'到您的链接以对其进行 ajaxify。
在您的 config > enviroments > development.rb 中设置config.action_controller.perform_caching = true,这样您就可以在推送到生产环境之前看到这个工作 =p。
在您的下载操作上使用操作缓存,并在需要时设置适当的过期时间,即caches_action :download, :expires_in => 5.minutes在您的控制器顶部。
这意味着当您单击链接时,它将发送 ajax 请求、生成 pdf 并返回页面。现在页面已缓存,因此如果您再次单击链接,请求将花费毫秒而不是秒。接下来,我们需要做的只是一点 javascript,一旦准备好就可以下载 pdf。
但是你做你的javascript(不显眼或不显眼)添加以下内容:
$("#download_link").on('ajax:success', function(){
document.location = $(this).attr("href")
});
:remote => true一旦ajax请求成功(即生成pdf),这将使浏览器跟随链接,就好像链接不存在一样。因为响应已被缓存,它会立即下载。
好的,您必须使用各种 AJAX 回调。
假设您的页面上有生成 PDF 的链接。
<%= link_to 'Generate PDF', '/generate_pdf', :id=>'genpdf', :remote=>true %>
现在您必须将事件绑定到上面创建的“genpdf”元素。IE
$('#genpdf').bind('ajax:beforesend', disablepdf)
$('#genpdf').bind('ajax:complete', enablepdf)
然后定义上面声明的两个 javascript 函数来根据需要操作 HTML 元素。
var disablepdf = function() { $("#genpdf").removeAttr("disabled") };
var enablepdf = function() { $("#genpdf").attr("disabled", "disabled") };