Может быть лучше взять код, который вы используете в своем контроллере для рендеринга данных PDF, и создать модуль или класс в вашем каталоге lib
, скажем, lib/pdf.rb
, затем использовать этот код как в вашем контроллере, так и в ваша модель.
Обновление : Вы можете кэшировать сам файл PDF в файловой системе как файл с отметкой времени в качестве его имени или чего-то подобного, которые могут быть уникально идентифицированы. Затем добавьте атрибут file
или invoice
в модель, чтобы сохранить местоположение в базе данных для последующего использования.
Обновление : Вы можете использовать блочную форму respond_to
примерно так:
respond_to do |format|
format.html
format.pdf { InvoiceBuilder.create(@invoice) }
end
Обновление : Похоже, что ActionDispatch::Integration::Session
- это класс для создания и интерфейса для интеграционного тестирования. Но я думаю, что вы могли бы использовать его для своих целей.
Вы должны быть в состоянии использовать это так:
# app/models/invoice.rb
class Invoice < ActiveRecord::Base
def get_body
app = ActionDispatch::Integration::Session.new(Rails.application)
app.get("invoices/#{self.id}.pdf")
app.response.body # this returns the rendered content that the browser will see.
end
end
Другой способ - захватить содержимое с помощью curl
, т.е. curl http://localhost:3000/invoices/1.pdf
и сохранить вывод.