收到 'Use MyMailer.delay.mailer_action(args) to delay sending of emails.' 错误

Getting 'Use MyMailer.delay.mailer_action(args) to delay sending of emails.' error

我收到一个奇怪的错误:'Use MyMailer.delay.mailer_action(args) to delay sending of emails.' 但我似乎可以找出它的来源:

app/mailers/user_notifier.rb

class UserNotifier < ActionMailer::Base
  default from: "test@testing.com"

  def signup_email(user)
    @user = user
    mail(to: @user.email, subject: t("mailer.signup.subject"))
  end

  ...
end

在控制台中,非延迟的工作: UserNotifier.signup_email(user).deliver

但是添加延迟时,出现错误:

UserNotifier.signup_email(user).delay.deliver
  Rendered user_notifier/signup_email.html.erb (0.7ms)
RuntimeError: Use MyMailer.delay.mailer_action(args) to delay sending of emails.
    from /Users/quindici/.rvm/gems/ruby-2.1.2/gems/delayed_job-4.0.6/lib/delayed/performable_mailer.rb:20:in `delay'
    from (irb):6
    from /Users/quindici/.rvm/gems/ruby-2.1.2/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /Users/quindici/.rvm/gems/ruby-2.1.2/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /Users/quindici/.rvm/gems/ruby-2.1.2/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

它以前可以用,但有时会坏掉。仍然没有得到我的头周围。任何想法将不胜感激!谢谢。

我觉得你搞反了:

UserNotifier.signup_email(user).delay.deliver

应该是

UserNotifier.delay.signup_email(user)

当您使用 Delayed_job 时,您可以访问 .dealy 方法,然后您可以使用 .deliver_later 等操作邮件程序方法来延迟发送电子邮件。

在您的项目中添加 delayed_job 的简单方法:

  1. 在您的 Gemfile 中添加:

    gem "delayed_job_active_record"
    gem "daemons"

使用以下内容创建文件 "config/initializers/delayed_job_config.rb":

Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 60
Delayed::Worker.max_attempts = 3
Delayed::Worker.max_run_time = 5.minutes
Delayed::Worker.read_ahead = 10
Delayed::Worker.default_queue_name = 'default'
Delayed::Worker.delay_jobs = !Rails.env.test?
Delayed::Worker.raise_signal_exceptions = :term
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))
  1. 在终端中:

    $ bin/rails generate delayed_job:active_record
    $ bin/rake db:migrate
    $ bundle
    $ bin/delayed_job start

可选择查看日志:tail -f log/delayed_job.log

  1. 在你项目的一些Mailer中(你可以在rails控制台中执行):

    SomeMailer.delay.some_method

您的队列将在 60 秒内得到处理。您可以删除 属性 Delayed::Worker.sleep_delay = 60 以立即处理。

否则,您可以将您的应用程序配置为使用 delayed_job,就像您的适配器一样,用于活动作业和进程在后台运行。然后你需要输入config.active_job.queue_adapter = :delayed_job。这种模式总是你发送一封电子邮件,你不需要使用 .delay,而是调用邮件操作和 .deliver_later,例如:MyMailer.your_method.deliver_later。在此模式下,活动作业会将电子邮件排入 delayed_job 队列。

欢迎提出问题和建议。

参考:https://github.com/collectiveidea/delayed_job