【问题标题】:ActionMailer Observer not workingActionMailer 观察者不工作
【发布时间】:2013-01-30 20:40:08
【问题描述】:

我定义了一个 ActionMailer Observer,但它没有被调用。我该如何解决这个问题?导轨 3.1.3,红宝石 1.9.2。或者,我想要一个在从某个 ActionMailer 子类发送电子邮件时调用的方法。这是我能找到的唯一干净的实现方法(我可以从 ActionMailer 子类中的每个邮件方法调用一个方法,但这不是很干)。欢迎任何其他有关如何完成此任务的建议。

config/initializers/mail_observer.rb:
  class MailObserver
    def self.delivered_email(message)
      require 'ruby-debug' ; debugger
      user = User.find_by_email(message.to[0])
      if user
        email_type = caller[1]
        UserMailerLogging.create!(user_id: @user.id, email_type: email_type, contents: self.body)
      end
    end
  end

  ActionMailer::Base.register_observer(MailObserver)

app/mailers/user_mailer:
  class UserMailer < ActionMailer::Base
    default from: "no-reply@testing.com"
    ...
    def unfinished_setup(user)
      @user = user
      mail to: user_email(user), subject: "Testing..."
    end
    ...
  end

并且,在 Rails 控制台中:

irb(main):001:0> UserMailer.unfinished_setup(User.find(1))    
=> #<Mail::Message:70192154395900, Multipart: false, Headers: <From: no-reply@testing.com>, <To: Test User<user@testing.com>>, <Subject: Testing...>, <Mime-Version: 1.0>, <Content-Type: text/plain>>

【问题讨论】:

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


    【解决方案1】:

    我相信在您真正传递消息之前,观察者不会触发。您在 rails 控制台中的代码只是创建电子邮件,而不是发送它。在末尾添加.deliver 应该会传递消息并执行观察者代码。

    【讨论】:

    • 谢谢,你是对的。我的生产代码中有交付(邮件程序的调用者),但我没有将.deliver 附加到控制台中的测试命令。这样做解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 2011-04-14
    • 2017-12-04
    • 1970-01-01
    • 2015-02-14
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多