Rails render_to_string "неопределенный метод" для пользовательского помощника - PullRequest
0 голосов
/ 05 августа 2020

Rails 6 ...

У меня есть специальный помощник, который отлично работает, когда я указываю браузеру на представление. Но я использую то же представление в другом месте для создания PDF-файла (с помощью render_to_string), который прикрепляется к электронному письму. В этом контексте я получаю ошибку undefined method.

Вот приложение / views / submissions / show.slim (это React SPA):

= javascript_tag do
  | var rawForm =  #{raw(@submission.frm.to_json)}

= pdf_stylesheet_pack_tag 'shower'
= pdf_javascript_pack_tag 'shower'

Вот приложение / помощники /pdf_helper.rb

module PdfHelper
  def pdf_stylesheet_pack_tag(source)
    if running_in_development?
      options = { media: "all" }
      wds = Webpacker.dev_server
      options[:host] = "#{wds.host}:#{wds.port}" unless show_as_html?
      stylesheet_pack_tag(source, options)
    else
      wicked_pdf_stylesheet_pack_tag(source)
    end
  end

  def pdf_javascript_pack_tag(source)
    if running_in_development?
      options = {}
      wds = Webpacker.dev_server
      options[:host] = "#{wds.host}:#{wds.port}" unless show_as_html?
      javascript_pack_tag(source, options)
    else
      wicked_pdf_javascript_pack_tag(source)
    end
  end

  def show_as_html?
    params[:debug].present?
  end

end

(Этот помощник устраняет проблему с гемом Wicked PDF.)

Вот app / mailers / notifications_mailer.rb

class NotificationsMailer < ApplicationMailer
  def new_submission(submission, email)
    @submission = submission
    @frm = submission.frm
    attachments["submission-#{submission.id}.pdf"] = WickedPdf.new.pdf_from_string(
      render_to_string(
        'submissions/show',
        layout: 'pdf',
        locals: {:@submission => submission}
      )
    )
    mail to: email
  end
end

Когда почтовая программа пытается отправить электронное письмо. Я вижу эту ошибку в журналах:

[ActiveJob] [ActionMailer::MailDeliveryJob] [f8ce8ecc-2ae5-447d-85f0-bd46bf3c8b20]   Rendered submissions/show.slim within layouts/pdf (Duration: 39.5ms | Allocations: 12324)
[ActiveJob] [ActionMailer::MailDeliveryJob] [f8ce8ecc-2ae5-447d-85f0-bd46bf3c8b20] NotificationsMailer#new_submission: processed outbound mail in 444.2ms
[ActiveJob] [ActionMailer::MailDeliveryJob] [f8ce8ecc-2ae5-447d-85f0-bd46bf3c8b20] Error performing ActionMailer::MailDeliveryJob (Job ID: f8ce8ecc-2ae5-447d-85f0-bd46bf3c8b20) from Async(mailers) in 444.67ms: ActionView::Template::Error (undefined method `pdf_javascript_pack_tag' for #<#<Class:0x00007f8c728defb8>:0x00007f8c728dcc68>):
/Users/emerson/Code/consent/app/views/submissions/show.slim:6:in `_app_views_submissions_show_slim__295365913496948297_70120585776840'

Что мне не хватает?

1 Ответ

0 голосов
/ 05 августа 2020

render_to_string - метод класса ActionController. Попробуйте использовать метод render_to_string вне контроллеров (унаследованных от ActionController), как показано ниже.

ApplicationController.new.render_to_string('submissions/show',
        layout: 'pdf',
        locals: {:@submission => submission})
...