我正在尝试使用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
我可以看到作业流程在手动执行时会被记录,但是当它通过表单时就不会记录。
数据库中没有失败的作业。
之前有人碰到这样的事吗?
答案 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::Syck和http://effectif.com/ruby-on-rails/syck-and-psych-yaml-parsers-on-heroku
答案 1 :(得分:0)
您需要使用命令
启动worker rake jobs:work
在你的heroku rails控制台上。