延迟作业和 Mandrill:未初始化的常量 Mandrill::API

Posted

技术标签:

【中文标题】延迟作业和 Mandrill:未初始化的常量 Mandrill::API【英文标题】:Delayed job and Mandrill: uninitialized constant Mandrill::API 【发布时间】:2014-08-26 06:33:46 【问题描述】:

我有邮件服务,用户可以上传包含电子邮件和其他一些用户相关数据的 .xls 文件以发送电子邮件活动。

我遇到了一些超时问题,因为它需要几秒钟来处理(因为我对要发送的每封电子邮件进行了一些验证和配置,例如:将记录保存到数据库,检查电子邮件是否在过去 30 天内发送,为每封电子邮件创建个性化的 html 代码(以创建包含电子邮件地址作为参数的链接等)。

经过一些研究,将其移至delayed job 似乎是合理的,正如this rails cast 中所建议的那样。唯一的问题是我遇到了一个错误,上面写着uninitialized constant Mandrill::API,似乎在我运行作业时,调用require 'mandrill' 不起作用。

我在模型文件中创建了任务。像这样的

class Mailer < ActiveRecord::Base
  attr_accessible :email, :lastname, :name

  def self.send_mail(emails)

    [...a lot of code here...]

    require 'mandrill'
    m = Mandrill::API.new ENV['MANDRILL_APIKEY']
    message = 
    :subject=> template.subject,
    :from_name=> template.from_name,
    :from_email=> from + "@" + email_domain,
    :to=>mails,
    :global_merge_vars=> [
       :name => 'GREETING', :content => template.greeting,
       :name => 'CONT1', :content => template.message,
       :name => 'IMAGE', :content => image_url,
          ],
    :html=>email_template,
    :preserve_recipients => false,
    :merge_vars => email_contents,
    
    sending = m.messages.send message

  end
end

我从我的控制器调用Mailer.send_mails(emails),它工作得很好,但是如果我调用Mailer.delay.send_mails(emails),我得到了错误。我该如何解决这个问题?

我尝试在课程开始时、class Mailer &lt; ActiveRecord::Base 之前和之后添加require 'mandrill',但似乎没有任何效果

【问题讨论】:

让我们把愚蠢的问题排除在外 - 在进行这些更改后,您是否重新启动了您的延迟作业守护程序?该环境不像开发中的 Rails 那样自动重新加载,AFAIK。 你是对的...我确信愚蠢的问题可以解决 *** 中 99% 的问题。我只是重新启动服务器而不是守护进程。请添加您的评论作为答案,以便我将其标记为正确 【参考方案1】:

确保重新启动delayed_job 守护程序以获取任何代码更改。它不像 Rails 开发环境那样自动重新加载。

【讨论】:

以上是关于延迟作业和 Mandrill:未初始化的常量 Mandrill::API的主要内容,如果未能解决你的问题,请参考以下文章

通过 Mandrill 发送 Gmail - 电子邮件延迟

rspec 中未处理延迟作业

Mandrill 在 Rails 上发送电子邮件 ruby

未定义的方法和未初始化的常量错误

使用 Mandrill send_at 或 Celery countdown/eta 延迟发送电子邮件

Rails:延迟作业-> 发送异步邮件时未接收“来自”字段