使用以下方式提供pdf:remote =>真正

时间:2012-05-06 23:47:33

标签: ruby-on-rails ajax ruby-on-rails-3 jquery

我有一个form_tag,用于生成pdf并将其提供给用户。最终的send_data如下:

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

这可以使用标准格式正常工作,但是当我尝试使用ajax设置时它不起作用:remote =>真。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

  2. 在您的配置中设置config.action_controller.perform_caching = true>环境> development.rb所以你可以在推送到production = p。

  3. 之前看到这个工作
  4. 对您的下载操作使用Action Caching,并根据需要设置适当的到期日期,即控制器顶部的caches_action :download, :expires_in => 5.minutes

    这意味着当您点击链接时,它将发送ajax请求,生成pdf并返回页面。现在页面被缓存,因此如果再次单击该链接,请求将花费毫秒而不是秒。接下来我们需要做的就是在准备好之后下载PDF文件。

  5. 但是,您使用javascript(不显眼或不显眼)添加以下内容:

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

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

答案 1 :(得分:0)

  1. 使用远程链接开始渲染过程
  2. 让您的服务器开始后台作业以创建PDF,并向用户返回作业ID
  3. 使用javascript在计时器上轮询服务器,发送作业ID并询问它是否完整
  4. 完成后,将用户重定向到可以下载PDF的页面。

答案 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") };