【问题标题】:Rails Delayed Job & Library ClassRails 延迟作业和库类
【发布时间】:2023-04-08 02:04:02
【问题描述】:

嘿,我们有一个库类 (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,抱歉,我不知道如何让它加载您的库类。
  • 我注意到这个问题存在于任何不是ActiveRecord 模型的东西上。我的 PORO 在app/models 中,通常它是由 Rails 自动加载的。 delayed_job 似乎有问题,除非我使用 Jonathan 下面描述的初始化程序解决方案。

标签: ruby-on-rails delayed-job


【解决方案1】:

Delayed_job 总是自动加载 ActiveRecord 类,但它不知道它在数据库中作为 YML 编组的其他类型的类(如 lib)。因此,您需要为它们显式触发类加载器。由于 DJ 启动了 Rails 环境,只需在初始化程序中提及任何非 AR 封送类:

(config/initializers/load_classes_for_dj.rb)

Mixpanel

【讨论】:

  • 谢谢,这也帮助了我!模块注意事项:使用“include ModelName”
【解决方案2】:

一个小问题,我按照乔纳森的建议,但我需要在类名前添加一个require,所以我将它用于load_classes_for_dj.rb

require 'mixpanel'
Mixpanel

然后它工作正常!

【讨论】:

  • 在 config/application.rb 中有 config.autoload_paths += %W(#{config.root}/lib) 将需要 lib 中的所有类,以防您需要大量文件 = )
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多