Heroku不通过控制器发送延迟作业电子邮件

时间:2012-10-21 05:22:40

标签: ruby-on-rails heroku ruby-on-rails-3.2 delayed-job

我正在尝试使用Heroku上的Rails 3.2应用程序中的延迟作业发送电子邮件,当有人填写表单时。我已经能够通过本地开发机器上的延迟作业成功发送电子邮件。如果我通过Heroku上的控制台手动运行它,我也可以使用延迟作业来发送电子邮件。但是,当有人提交触发电子邮件的表单时,它将不会发送。

这是我的邮件:

class ClaimMailer < ActionMailer::Base
  default from: "noreply@coatchex.com"

  def patron(claim)
    mail(:to => claim.email, :subject => I18n.t('mailers.claims.patron.subject'))
  end

  def coatchex(claim)
    @claim = claim
    mail(:to => 'claims@coatchex.com', :subject => I18n.t('mailers.claims.coatchex.subject'))
  end
end

这是我的控制器:

class ClaimsController < ApplicationController
  layout 'basic'

  def new
    @claim = CoatChex::Forms::Claim.new
  end

  def create
    @claim = CoatChex::Forms::Claim.new(params[:claim])
    if @claim.valid?
      ClaimMailer.delay.coatchex(@claim)
      render :thank_you
    else
      render :new
    end
  end
end

就像我提到的那样,如果我通过Heroku控制台运行以下命令,它会在延迟的工作中将电子邮件排队并发送它就好了:

@claim = ...
ClaimMailer.delay.coatchex(@claim)

但是,每当我通过表单发送它时,它都不会触发。

如果我足够快,我可以在Heroku控制台中运行Delayed :: Job.count,并在通过表单提交作业之前看到值1。所以我知道推迟的工作是得到它。如果我使用

查看工作日志
heroku logs -p worker -t

我可以看到作业流程在手动执行时会被记录,但是当它通过表单时就不会记录。

数据库中没有失败的作业。

之前有人碰到这样的事吗?

2 个答案:

答案 0 :(得分:0)

我有类似的问题。一个很好的起点是https://devcenter.heroku.com/articles/delayed-job#debugging处的信息 - 特别是在Heroku控制台上运行Delayed::Job.last.last_error

在我的情况下,我得到的错误是Job failed to load: uninitialized constant Syck::Syck,通过将psych添加到我的gemfile来修复。请参阅Delayed_job: Job failed to load: uninitialized constant Syck::Syckhttp://effectif.com/ruby-on-rails/syck-and-psych-yaml-parsers-on-heroku

答案 1 :(得分:0)

您需要使用命令

启动worker

rake jobs:work

在你的heroku rails控制台上。