延迟作业乘客生产未定义方法错误

时间:2011-10-05 15:19:27

标签: passenger actionmailer delayed-job

我正在使用延迟作业版本2.1.4和动作邮件程序3.0.8在后台发送我的电子邮件。

UserMailer.delay.newsletter(email)

它在开发和生产Rails 控制台方面很适合我。

但是当它从我的实时制作乘客服务器调用时,它会创建DJ,但是当这个DJ运行时,它会抛出

{undefined method `newsletter' for #<Class:0xc08afa0>

我认为问题

任何帮助?

2 个答案:

答案 0 :(得分:1)

问题在于使用类方法

的生产模式中的rails / passenger

所以,我做了一个解决方案...我将尝试调用实例方法,并避免调用方法。

让我们看一个例子;假设我需要在后台调用以下方法..

UserMailer.deliver_newsletter(email)

然后,我创建了一个新类DelayClassMethod

class DelayClassMethod
  def initialize(receiver_name, method_name, options={})
    @receiver_name = receiver_name
    @method_name = method_name
    @parameters = options[:params] || []
  end

  def perform
    eval(@receiver_name).send(@method_name, *@parameters)
  end
end 

并且现在可以通过

在后台运行该方法
DelayClassMethod.new("UserMailer", "deliver_newsletter", :params=>[email]).delay

所以,我现在在后台运行一个实例方法,它将运行方法。

另一个例子..

假设我想要运行

Product.list_all_by_user_and_category(user, category).delay

然后它可以通过

运行
DelayClassMethod.new("Product", "list_all_by_user_and_category", :params => [user, category]).delay

答案 1 :(得分:0)

我的预感是你在生产中有多个版本的delayed_job。您是否使用捆绑工具来启动延迟的工作流程?

我建议在执行bundle install in production时,我会使用--binstubs标志生成delayed_job周围的包装器并使用该可执行文件来启动作业。