1

我们有一个 Rails 3.2.14 应用程序,它仅在生产中表现不佳。电子邮件无法发送并显示以下错误消息:

ActionView::MissingTemplate (Missing template /invoice with {:locale=>[:en], :formats=>[:text], :handlers=>[:erb, :builder]}. Searched in:
  * "/var/www/appname/releases/20131003214241/app/views"
):
app/mailers/mailer.rb:42:in `block in invoice'
app/mailers/mailer.rb:41:in `invoice'
app/controllers/admin_controller.rb:410:in `resend_invoice'

Mailer#invoice 方法如下所示:

def invoice(order, resent=false, receipt_or_invoice = "Receipt")
  @order = order
  @freebie = @order.freebie?
  @mail = true
  @transaction = @order.beanstream_transaction
  @user = @order.user
  recipient = @order.email_receipt_to || @user.email || "support@example.com"
  @receipt_or_invoice = receipt_or_invoice

  subject = @freebie ? "Your License" : "Your #{receipt_or_invoice.capitalize} and License     Information#{ resent ? " (Resent)" : ""}"
  mail = mail(:to => [recipient], :subject => subject)
  mail.add_part(Mail::Part.new do
    content_type 'multipart/alternative'
    # THE ODD BIT vv
    mail.parts.reverse!.delete_if {|p| add_part p }
  end)
  mail.content_type 'multipart/mixed'
  mail.header['content-type'].parameters[:boundary] = mail.body.boundary
  @order.line_items.each do |li|
    aq_data = li.license.aquatic_prime_data
    if aq_data.present?
      attachments[li.license.aquatic_prime_filename] = {content: aq_data, mime_type:     'application/xml'}
    end
  end
  return mail
end

一对夫妇的笔记。

  1. 这在使用 Pow 的开发中表现良好。生产使用 Apache+Passenger。
  2. 在此之前,我们对邮件程序所做的最后一次更改是在 6 月添加一个新方法。我们没有看到其他有关未能发送电子邮件的报告。这让我觉得 ActionMailer 或其他 Rails gem 中的某些变化以某种方式导致了这个问题。
  3. 当从我们的商店控制器或代码的其他部分调用 Mailer.invoice 时也会发生该错误,因此我认为它已本地化为 Mailer。
  4. 在开发中,我们使用 Google SMTP 服务器发送邮件,而我们在生产中使用 Postmark。

提前感谢您的任何帮助或见解!

4

1 回答 1

1

事实证明,如果某些事情看起来很复杂,那么您通常做错了。我将我们的Mailer#invoice方法更改为这样,并且效果很好:

def invoice(order, resent=false, receipt_or_invoice = "Receipt")
  @order = order
  @freebie = @order.freebie?
  @mail = true
  @transaction = @order.beanstream_transaction
  @user = @order.user
  recipient = @order.email_receipt_to || @user.email || "support@example.com"
  @receipt_or_invoice = receipt_or_invoice

  subject = @freebie ? "Your License" : "Your #{receipt_or_invoice.capitalize} and License         Information#{ resent ? " (Resent)" : ""}"
  @order.line_items.each do |li|
    aq_data = li.license.aquatic_prime_data
    if aq_data.present?
      attachments[li.license.aquatic_prime_filename] = {content: aq_data, mime_type:         'application/xml'}
    end
  end
  mail(:to => [recipient], :subject => subject)
end

关键是在邮件方法之前做附件。然后多部分/替代的东西工作正常,附件处理得当。

我们仍然遇到 Postmark 拒绝提供我们的自定义文件扩展名附件的问题,但这是一个单独的问题。我不知道为什么我们正在经历的所有阴谋都在破坏我们的视图 template_path 或者为什么问题没有在开发中体现出来,但它就是……</p>

于 2013-10-04T00:58:19.677 回答