2012-05-06 42 views
1

我有一個form_tag,它生成pdf並將其提供給用戶。最後SEND_DATA是這樣的:使用以下語言提供pdf:remote => true

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

這工作得很好用STANDAR形式,但是當我嘗試使用AJAX來設置它不起作用:遠程=>真。

我想要做的最終事情是使用:disable_with在pdf生成時禁用按鈕。

關於如何解決這個問題的任何想法?

+0

我做了很多長期運行的pdf世代(在某些情況下爲23秒),並且當完成時,pdf通過send_data提供給用戶。所以我的第一個問題是你爲什麼要AJAX化這個過程?如果您的pdf世代運行時間很長,您是否希望允許用戶在生成pdf的同時繼續與表單交互?如果是這種情況,當PDF準備就緒時,您的表單上必須有一些內容說明'您的PDF已準備就緒,請點擊此處下載'。那是你在想什麼? – RadBrad

+0

不,我只想在生成過程中禁用生成按鈕,並在過程結束時重新啓用。 – Spyros

回答

0
  1. 使用遠程鏈接開始渲染過程
  2. 在您的服務器開始一個後臺任務,以創建PDF,返回給用戶的作業ID
  3. 使用JavaScript來輪詢計時器的服務器,發送作業ID並詢問它是否完整
  4. 完成後,將用戶重定向到可下載PDF的頁面。
+0

是的,那是我想到的替代方案。但是可以在沒有重定向到下載頁面的中間步驟的情況下完成嗎?像立即下載? – Spyros

+0

您可以在普通按鈕上disable_with - 如果您禁用該按鈕並且服務器在20秒後響應,則可能是金色。 –

+0

是的,但問題是,因爲設置了遠程true,所以它使用js進行響應,並且我沒有將send_back數據發送到瀏覽器,儘管該按鈕工作正常。 – Spyros

0

OK,你必須使用不同的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") }; 
1

我知道是一個古老的線程,但我想我應該讓你知道我是如何得到這情況下任何人合作發現其他方式存在這裏,像我一樣。

使用AJAX的請求的問題是,響應(pdf文件)幾乎是不可能的處理,然後用來將用戶爲文件以便不打擾。相反,我使用內置緩存的Rails來獲得下一代的pdf。

  1. 一旦你的鏈接工作「常規」添加:remote => true, :disable_with => 'loading...'到你的鏈接到ajaxify它。

  2. 設置config.action_controller.perform_caching = true在你的配置>環境> development.rb中,所以你可以看到這個工作,然後推到production = p。

  3. 在您的下載操作中使用Action Caching,並根據需要設置適當的過期期限,即控制器頂部的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)。由於響應已被緩存,因此會立即下載。

相關問題