Wicked_PDF визуализирует строку из шаблона в фоновом процессе

У меня есть «технология» контроллера, у которой есть действие для отправки электронной почты и выставления счета, оттуда мы используем Delayed::Job.enqueue, чтобы засунуть фактическое действие электронной почты в фоновый процесс, который будет обрабатываться с помощью рабочего динамометра на Heroku.

Это все работает нормально.

Проблема, которую я обнаружил, заключается в том, что мой сгенерированный счет в формате PDF хранится в файловой системе Heroku Web Dyno, и Worker понятия не имеет, где он находится.

Я загружу PDF в процессе генерации, это чертовски долго.

Поэтому мне нужно создать счет-фактуру на рабочем динамометрическом стенде, когда он будет выполнять действие почтовой программы для отправки сообщения.

Я нашел этот блог с подробными инструкциями по созданию pdf из строки: http://viget.com/extend/how-to-create-pdfs-in-rails

Но у меня он вообще не работает, вот код:

  html = render_to_string(:action =>":show", :layout => "invoice.html")
  @pdf = WickedPdf.new.pdf_from_string(html)

И ошибка:

"last_error"=>"undefined method `response_body=' for #<MailSenderJob:0x007fdf7e70a638>

Я знаю, что это из документов:

WickedPdf.new.pdf_from_string(
  render_to_string('templates/pdf.html.erb', :layout => 'pdfs/layout_pdf'),
  :footer => {
    :content => render_to_string(:layout => 'pdfs/layout_pdf')
  }
)

И этот код никогда не работал для меня вообще.

То, что я получаю снова и снова, - это ошибка response_body=. Как будто вообще нет ответа.

В верхней части моего файла я делаю:

  include ActionController::Rendering

Потому что это модуль, в котором есть метод render_to_string.

Любая помощь вообще - пожалуйста, имейте в виду в своем ответе, что я запускаю этот код на динамометрическом стенде Heroku WORKER - поэтому, если есть какая-либо зависимость, которую мне нужно включить вручную, которая естественным образом включена в веб-сервер, пожалуйста, дайте мне знать.


person notaceo    schedule 14.02.2014    source источник


Ответы (2)


В итоге мне пришлось делать с этим странные вещи, чтобы наконец заставить его работать.

  html = File.read(Rails.root.join('app','views','technician','invoice.html.erb'))
  html = ERB.new(html).result(binding)
  html = html.gsub!(/\0/,'')  # There is a null byte in the rendered html, so we'll strip it out (this is kind of a hack)

  #  Render the PDF - we're on a worker dyno and have no access to the pdf we rendered already on the web dyno

  @pdf = WickedPdf.new.pdf_from_string(
            html,
            :handlers => [:erb],
            :footer => {
              :center => "Copyright 2014"                   
            },
            :disable_smart_shrinking => true,
          )
@pdf = @pdf.gsub!(/\0/,'')  # Again with the null bytes!
person notaceo    schedule 14.02.2014

Использование частей.

Я знаю, что вы имеете в виду, это становится немного странно, когда вы обрабатываете PDF-файлы в фоновом задании, а не в действии контроллера.

Я подумал, что поделюсь своей реализацией в качестве сравнения и для других, чтобы получить еще один пример.

notification_mailer.rb

def export

  header_html = render_to_string( partial: 'exports/header.pdf.erb', 
                                  locals:  { report_title: 'Emissions Export' } )

  body_html   = render_to_string( partial: "exports/show.pdf.erb" )

  footer_html = render_to_string( partial: 'exports/footer.pdf.erb' )

  @pdf = WickedPdf.new.pdf_from_string(
           body_html,
           orientation: 'Landscape',
           margin: { bottom: 20, top: 30 },
           header: { content: header_html },
           footer: { content: footer_html } )

  # Attach to email as attachment.
  attachments["Emissions Export.pdf"] = @pdf

  # Send email. Attachment assigned above will automatically be included.
  mail( { subject: 'Emissions Export PDF', to: '[email protected]' } )

end
person Joshua Pinter    schedule 05.08.2015