Как вызвать метод класса из почтовой программы - PullRequest
0 голосов
/ 26 января 2019

У меня есть почтовик в каталоге: /my_app/app/mailers

Мой код в этом почтовом ящике:

class MyMailer < ApplicationMailer
  default from: 'todd@myemail.com'
  include Reports::OrderReport

  def welcome_email
    email = params[:email]
    mail(to: email, subject: 'Welcome to My Awesome Site')
    sheet = OrderReport.new
    sheet.create_workbook
  end

end

К электронным письмам, отправляемым от этой почтовой программы, мне нужно прикрепить отчет Excel, который генерируется из класса, определенного в /my_app/app/reports, и код в этом классе выглядит следующим образом:

class OrderReport
  require 'axlsx'
  attr_reader :shop, :order_workbook

  def initialize
    workbook_instance = Axlsx::Package.new
    @order_workbook = workbook_instance.workbook
  end

  def create_workbook
    order_workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
      sheet.add_row ["First Column", "Second", "Third"]
      sheet.add_row [1, 2, 3]
      sheet.add_row ['     preserving whitespace']
    end
    order_workbook.serialize("test_book.xlsx")
  end
end

Но когда я пытаюсь запустить свою почтовую программу с этим:

MyMailer.with(email: "this_email@gmail.com").welcome_email.deliver_now

Я получаю следующую ошибку:

NameError: uninitialized constant MyMailer::Reports
        from app/mailers/my_mailer.rb:3:in `<class:MyMailer>'
        from app/mailers/my_mailer.rb:1:in `<top (required)>'
        from (irb):1

Где я ошибся?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вы пытаетесь включить class OrderReport (Rails ожидает, что модуль будет включен). Просто удаление include Reports::OrderReport должно решить проблему. Также вы должны переименовать класс в Reports::OrderReport в /my_app/app/reports/order_report.rb и вваш почтовик из-за именования файлов Rails

0 голосов
/ 27 января 2019

Я думаю, вам нужно внести некоторые изменения в то, как вы используете имена классов.Наименование должно быть последовательным.Вы также можете обернуть класс OrderReport в модуль отчета, если хотите.

class MyMailer < ApplicationMailer
  default from: 'todd@myemail.com'
  include Reports::OrderReport

  def welcome_email
    email = params[:email]
    mail(to: email, subject: 'Welcome to My Awesome Site')
    sheet = Reports::OrderReport.new
    sheet.create_workbook
  end

end

class Reports::OrderReport
  require 'axlsx'
  attr_reader :shop, :order_workbook

  def initialize
    workbook_instance = Axlsx::Package.new
    @order_workbook = workbook_instance.workbook
  end

  def create_workbook
    order_workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
      sheet.add_row ["First Column", "Second", "Third"]
      sheet.add_row [1, 2, 3]
      sheet.add_row ['     preserving whitespace']
    end
    order_workbook.serialize("test_book.xlsx")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...