加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 尝试通过Rails ActionMailer发送电子邮件导致`

发布时间:2020-12-17 03:50:39 所属栏目:百科 来源:网络整理
导读:我有一个继承自ApplicationMailer的Mailer类,后者继承自ActionMailer :: Base. Ruby版本是ruby 2.4.1p111(2017-03-22修订版58053)[x86_64-darwin15]. Mailer类如下所示: class PurchaSEOrderStatusMailer ApplicationMailer CONTACTS = { JC: ['me@example.
我有一个继承自ApplicationMailer的Mailer类,后者继承自ActionMailer :: Base. Ruby版本是ruby 2.4.1p111(2017-03-22修订版58053)[x86_64-darwin15].

Mailer类如下所示:

class PurchaSEOrderStatusMailer < ApplicationMailer
  CONTACTS = {
    JC: ['me@example.com'],RM: ['me@example.com']
  }

  def daily_report_email(facility)
    @facility = facility
    ingredient_items = LineItem.ingredient.by_facility(facility)
    @delivered_count = ingredient_items.by_date([7.days.ago,7.days.from_now]).delivered.count
    @partial_count = ingredient_items.by_date([7.days.ago,1.day.ago]).partial.count
    @late_count = ingredient_items.by_date([7.days.ago,1.day.ago]).late.count
    @expected_count = ingredient_items.by_date([Date.today,7.days.from_now]).expected.count
    mail(to: CONTACTS[facility.to_sym],subject: "#{facility} Daily Receipt Status - #{Date.today}")
  end
end

ApplicationMailer如下所示:

# frozen_string_literal: true
class ApplicationMailer < ActionMailer::Base
  default from: 'notify@example.com'

  def facility_email(facility)
    emails = Rails.application.config_for(:emails)
    (emails[facility] + emails["DEFAULT"]).flatten
  end
end

该视图位于app / views / purchase_order_status_mailer / daily_report_email.html.erb.

当我打开我的Rails控制台并键入PurchaSEOrderStatusMailer.new.daily_report_email(‘JC’).deliver时,我看到以下错误:

NoMethodError: undefined method `empty?' for nil:NilClass
from /Users/me/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/actionview-5.0.4/lib/action_view/lookup_context.rb:215:in `normalize_name'

我尝试使用相同的调用将格式块传递给对邮件助手的调用,如下所示:

mail(to: CONTACTS[facility.to_sym],subject: "#{facility} Daily Receipt Status - #{Date.today}") do |format|
  format.text { render plain: "Hey!" }
end

以上产生了以下响应,似乎代表了成功的电子邮件发送:

Rendering text template
  Rendered text template (0.0ms)
Sent mail to me@example.com (8.8ms)
Date: Mon,25 Sep 2017 12:55:11 -0400
From: notify@example.com
To: me@example.com
Message-ID: <59c934efec401_1115b3fd69cc3f840917be@me-MBP.mail>
Subject: JC Daily Receipt Status - 2017-09-25
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Hey!
=> #<Mail::Message:70191029273300,Multipart: false,Headers: <Date: Mon,25 Sep 2017 12:55:11 -0400>,<From: notify@example.com>,<To: ["me@example.com"]>,<Message-ID: <59c934efec401_1115b3fd69cc3f840917be@me-MBP.mail>>,<Subject: JC Daily Receipt Status - 2017-09-25>,<Mime-Version: 1.0>,<Content-Type: text/plain>,<Content-Transfer-Encoding: 7bit>>

我实际上没有收到电子邮件,我认为这意味着我没有在本地计算机上设置SMTP,但上述响应令人鼓舞.有没有堆栈我上面张贴的错误跟踪分开,所以我试图挖掘到Rails的源代码,我看到里面lookup_context.rb是normalize_name被从args_for_lookup保护的方法,进而得到由ViewPaths模块的称为内调用find_all方法.但除此之外,很难跟踪调用堆栈,因为我找不到find_all的调用者是谁.

我的问题是:第一次拨打电话有什么问题?

编辑1:我也尝试过format.html {渲染HTML: “< H1>您好米克尔< / H1>!” html_safe}代替format.text选项,按例子here,和我有类似的成功信息.

然后我尝试在normalize_name中添加一个byebug语句,以尝试识别成功的电子邮件发送的参数值是什么,但看起来这个方法在传递块时没有被调用.这让我更加怀疑这个问题与我的观点有某种关系.但我还不能确认.

解决方法

问题在这里

PurchaSEOrderStatusMailer.new.daily_report_email('JC').deliver

删除新的即

PurchaSEOrderStatusMailer.daily_report_email('JC').deliver

因为它的错误对象无法推断出模板路径/文件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读