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