Передать дополнительную информацию в ActionMailer Observer - PullRequest
3 голосов
/ 26 февраля 2012

Мне нужно сохранить информацию об отправке каждого электронного письма моему клиенту в базу данных для дальнейшего анализа.Поэтому я пытаюсь сделать это в Observer, но там мне нужна информация о счетах.Итак, у меня есть Mailer:

class ClientMailer < ActionMailer::Base
  default :from => "no-reply@tori-app.herokuapp.com"

  def remind(client, invoices)
    @client = client
    @company = @client.company
    @invoices  = invoices.to_a

    @template = t('message.template')

    @text = liquid_parse @template
    @html = markdown_parse @text

    mail(:to => @client.email, :subject => t('message.title')) do |format|
      format.html
      format.text
    end
  end

  private
    def markdown_parse(text)
      markdown = Redcarpet::Markdown.new Redcarpet::Render::HTML,
        :autolink => true, :space_after_headers => true
      markdown.render text
    end

    def liquid_parse(text)
      renderer = Liquid::Template.parse text
      renderer.render 'company' => @company, 'invoice' => @invoice, 'client' => @client
    end
end

И вопрос: как передать @invoices наблюдателю ActionMailer?

1 Ответ

8 голосов
/ 11 марта 2012

Я сделал это сам, добавив в почтовик:

headers 'X-Invoice-IDs' => @invoices.map(&:id).join(';')

А потом у наблюдателя

ids = message.header['X-Invoice-IDs'].to_s.split ';'

И там у меня есть все идентификаторы счетов в моем наблюдателе.

EDIT

После четверговой встречи PRUG у меня возникла идея перегрузить метод delivery вместо использования наблюдателя. Он будет совместим с Rails 4 и будет проще в использовании (поскольку мне не потребуется передавать дополнительный заголовок, я буду использовать только переменную экземпляра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...