将其他信息传递给ActionMailer Observer

时间:2012-02-26 18:05:49

标签: ruby-on-rails actionmailer observer-pattern

我需要保存有关将每封电子邮件发送到我的客户端以进行进一步分析的信息。所以我试图在Observer中做到这一点,但我需要有关发票的信息。 所以我有梅勒:

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 个答案:

答案 0 :(得分:8)

我自己通过添加邮件来完成:

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

然后在观察者中

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

我的观察员身上有所有发票ID。

修改

PRUG的星期四会议之后,我想到了重载delivery方法,而不是使用观察者。它将与Rails 4兼容并且更易于使用(因为我不需要传递额外的头文件,我将只使用实例变量)。