Rails延迟作业和库类

8

嘿,我们有一个库类(lib/Mixpanel),它调用延迟作业如下:

class Mixpanel

  attr_accessor :options
  attr_accessor :event

  def track!()
   .. 
   dj = send_later :access_api # also tried with self.send_later
   ..
  end

  def access_api
   ..
  end

问题在于当我们运行 rake jobs:work 时,会出现以下错误:
undefined method `access_api' for #<YAML::Object:0x24681b8>

有什么想法吗?

看起来延迟作业不知道你的库类,所以它只成为一个YAML::Object,很抱歉我不知道你如何让它加载你的库类。 - Corey
我注意到这个问题存在于任何不是ActiveRecord模型的东西中。我的PORO在app/models中,通常情况下,Rails会自动加载它。除非我使用Jonathan下面描述的初始化程序解决方案,否则delayed_job似乎无法处理它。 - Kenrick Chien
2个回答

16

Delayed_job总是自动加载ActiveRecord类,但它并不知道其他类型的类(比如lib),这些类已经以YML格式保存在数据库中。因此,您需要显式触发这些类的类加载器。由于DJ启动Rails环境,只需在初始化程序中提及任何非AR序列化类即可:

(config/initializers/load_classes_for_dj.rb)

Mixpanel

谢谢,这也帮助了我!模块注意事项:使用“include ModelName”。 - vfilby

2

有一个小问题,我按照Jonathan的建议做了,但是我需要在类名前添加require,所以我会在load_classes_for_dj.rb中使用这个:

require 'mixpanel'
Mixpanel

然后它运行良好!


在config/application.rb中添加config.autoload_paths +=%W(#{config.root} / lib)将要求lib中的所有类,以防您有许多要求的文件=) - Abdo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接