在我的 Rails 7 應用程式到 PDF 創建中,我正在使用外部服務。要獲取 PDF,我必須發送一個 GET 請求,并在回應中收到編碼字串。現在我想提供下載此檔案而不將其保存在服務器上的可能性。
怎么做?所有搜索的主題都差不多有 10 年的歷史了,這是一種現代方式(或者可能是寶石)嗎?
我發現的所有內容實際上都歸結為以下代碼:
# service which I'm using to create generate pdf from string
class PdfGenerator
def initialize(binary_pdf)
@binary_pdf = binary_pdf
end
attr_reader :binary_pdf
def call
File.open('invoice.pdf', 'wb') do |file|
content = Base64.decode64(binary_pdf)
file << content
end
end
end
# payments_controller.rb
def pdf_download
response = client.invoice_pdf(payment_id: params[:id]) # get request to fetch pdf
PdfGenerator.new(response[:invoice_pdf]).call
end
查看我到達pdf_download端點的位置:
<%= link_to t('.pdf_download'), pdf_download_payment_path(payment.id), data: { 'turbo-method' => :post } %>
我希望開始下載檔案,但沒有發生類似的事情。在 Rails 服務器中,我收到以下訊息:
找不到 PaymentsController#pdf_download 的模板,渲染頭:no_content 已完成 204 8 毫秒內沒有內容(ActiveRecord:0.2 毫秒 | 分配:2737)
uj5u.com熱心網友回復:
我的回答主要是猜測,因為處理檔案不是我的優勢之一。
但基本上是因為您無法在payments_controller#pdf_download諸如render等中逃脫redirect。您的應用程式在檔案夾中需要一個名為“pdf_download”的視圖views/payments。
在您的控制器中,您必須將資料發送給用戶,這應該可以解決問題:
send_data(file, disposition: 'inline', filename: "invoice.pdf", type: 'application/pdf')
或者
send_data(PdfGenerator.new(response[:invoice_pdf]).call, disposition: 'inline', filename: "invoice.pdf", type: 'application/pdf')
在你的情況下。(呼叫動作應該回傳檔案,如果它沒有更明確的回傳陳述句)
雖然有一件事:您從應用程式根目錄中的同一檔案“invoice.pdf”創建發票。由于 GIL/GVL 一次只有一個執行緒在執行 Ruby,因此您的檔案將一次性創建,并以相同的方式回傳給用戶,沒有任何問題。
盡管如果您更改應用程式的作業方式,可能會引入異步,那么在多個執行緒同時修改同一個檔案的情況下可能會發生競爭。然后,您可以切換到使用具有不同名稱的臨時檔案,或者找到一種方法使您的發票完全不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510054.html
標籤:轨道上的红宝石红宝石
上一篇:當我們復制RubyonRails容器時,Sidekiq會運行多次嗎?
下一篇:ruby陣列按多個元素值分組
