1

我有一个生成 pdf 并将其提供给用户的 form_tag。最终的 send_data 是这样的:

send_data pdf.render, type: 'application/pdf', :filename => filename, :compress => true

这适用于标准表单,但当我尝试使用 ajax 设置时它不起作用:remote => true。

我想做的最终事情是使用 :disable_with 在生成 pdf 时禁用按钮。

关于我如何解决这个问题的任何想法?

4

3 回答 3

1

我知道这是一个旧线程,但我想我会让你知道我是如何让它工作的,以防其他人像我一样在这里找到方法。

将 ajax 用于请求的问题是响应(pdf 文件)几乎无法处理,然后作为文件提供给用户,所以不要打扰。相反,我使用内置缓存的 Rails 来获取生成后的 pdf。

  1. 一旦您的链接“按常规”工作,请将其添加:remote => true, :disable_with => 'loading...'到您的链接以对其进行 ajaxify。

  2. 在您的 config > enviroments > development.rb 中设置config.action_controller.perform_caching = true,这样您就可以在推送到生产环境之前看到这个工作 =p。

  3. 在您的下载操作上使用操作缓存,并在需要时设置适当的过期时间,即caches_action :download, :expires_in => 5.minutes在您的控制器顶部。

    这意味着当您单击链接时,它将发送 ajax 请求、生成 pdf 并返回页面。现在页面已缓存,因此如果您再次单击链接,请求将花费毫秒而不是秒。接下来,我们需要做的只是一点 javascript,一旦准备好就可以下载 pdf。

  4. 但是你做你的javascript(不显眼或不显眼)添加以下内容:

$("#download_link").on('ajax:success', function(){
    document.location = $(this).attr("href")
});

:remote => true一旦ajax请求成功(即生成pdf),这将使浏览器跟随链接,就好像链接不存在一样。因为响应已被缓存,它会立即下载。

于 2012-11-15T23:52:34.193 回答
0

好的,您必须使用各种 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") };
于 2012-05-07T04:02:19.133 回答
0
  1. 使用远程链接开始渲染过程
  2. 让您的服务器开始创建 PDF 的后台作业,向用户返回作业 ID
  3. 使用 javascript 在计时器上轮询服务器,发送作业 ID 并询问它是否完成
  4. 完成后,将用户重定向到可以下载 PDF 的页面。
于 2012-05-07T01:41:09.560 回答