我正在使用延迟作业版本2.1.4和动作邮件程序3.0.8在后台发送我的电子邮件。
UserMailer.delay.newsletter(email)
它在开发和生产Rails 控制台方面很适合我。
但是当它从我的实时制作乘客服务器调用时,它会创建DJ,但是当这个DJ运行时,它会抛出
{undefined method `newsletter' for #<Class:0xc08afa0>
我认为问题
任何帮助?
答案 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周围的包装器并使用该可执行文件来启动作业。