未初始化的常量Delayed::Job

21

我已经在我的Gemfile中添加了delayed_job gem并成功安装,但当我尝试运行以下代码时:

Delayed::Job.enqueue do_it(), 0, 1.minutes.from_now.getutc

我遇到了“未初始化的常量Delayed :: Job”错误。

有人能解释一下我需要做什么吗? 我尝试先运行“rake jobs:work”,但它也显示“未初始化的常量Delayed :: Job”错误。 另外,我已将“require 'delayed_job'”添加到文件(application.rb),但效果不大。

6个回答

18

如果您已经升级到delayed_job版本>=3,您需要添加以下内容(假设您正在使用ActiveRecord):

# Gemfile
gem 'delayed_job_active_record'

1
非常有帮助 - 我也遇到了这个问题。顺便提一下,为了避免其他人遇到同样的问题,我还不得不将我的Paperclip使用从gem 'aws-s3'更新到gem 'aws-sdk' - Peter Nixey
2
请在此处查看“从Active Record 2.x升级到3.0.0”的内容:https://github.com/collectiveidea/delayed_job - Cam
这解决了我在Heroku上移动到cedar堆栈的问题,还有Peter关于aws的评论。谢谢! - jbg

15

你是否按照README文件中的安装说明进行操作?https://github.com/collectiveidea/delayed_job

将以下内容添加至你的Gemfile:

gem 'delayed_job_active_record'

然后在控制台运行以下代码:

$ rails generate delayed_job:active_record
$ rake db:migrate

您需要在数据库中创建延迟作业表(假设您正在使用Active Record)。

对于Rails 3,您只需要在Gemfile中包含它,运行上面的代码来创建表并迁移数据库,然后重启服务器并开始使用!


1
还要确保您也添加了 app/models/delayed_job.rb。不需要定义太多,只需类本身:class DelayedJob < ActiveRecord::Base end 就可以了。 - sorens
@sorens 你能确认这是必要的步骤吗? - just__matt
@just__matt 我相信是这样的,但我还没有确认过。开始一个新的Rails项目,添加delayed_job gem,跳过model并查看。 - sorens
5
我正在使用 delayed_job,没有定义 DelayedJob 模型 - 我认为这不是必要的步骤 - 我建议不要这样做以避免混淆。 - just__matt
听起来这是一个可选步骤。我编写了 CustomJobs 来封装所有的 delayed_job 功能。也许这就是为什么需要它的原因。对于未来的开发人员,可以尝试不创建模型,如果可以工作,那就可以开始了! - sorens

10

我正在使用一个引擎内的延迟作业(因此gem是在.gemspec文件中指定而不是Gemfile中),并且遇到了相同的错误。我发现可以通过使用以下代码来解决问题:

require 'delayed_job_active_record'  # fixes problem

相比于
require 'delayed_job'                # doesn't

3
没有。关键是,在引擎中,我必须明确使用一个 require 语句。其他答案是针对标准的 Rails 应用程序,只需要在 Gemfile 中使用 "gem 'delayed_job_active_record'" 就足够了。但对于一个引擎来说情况并非如此,因为 gem 是在 gemspec 中定义的,所以在代码中需要使用 require 语句来引入它。 - ReggieB
是的,这个 require 语句就可以了!谢谢。 - Alex V
谢谢你的答案,这对我在Rails引擎中工作有效。如果有人像我一样想知道,那么require语句应该放在engine.rb文件的顶部。 - Asciant

2

1
这解决了我的问题,但是那个链接只有一行代码,你完全可以把它粘贴在这里。 - lfzawacki
Delayed::Worker.backend = :active_record - ReggieB

1
我之前也曾经遇到过同样的问题。我在跟随 Ryan Bates 的 Delayed_Job 视频教程时,遇到了同样的错误:“未初始化常量 Delayed::Job”。在视频教程中,Ryan 创建了一个名为 mailing_job.rb 的文件(位于 lib 文件夹下),其中包含了 delayed_job 执行方法,这使得你可以使用 enqueue 方法。经过一些研究,我发现 Rails 3 不会自动将 lib 文件夹中的文件加载到应用程序中。(不是完全确定)
尝试这个
在你使用以下代码的控制器中:
"Delayed::Job.enqueue do_it(), 0, 1.minutes.from_now.getutc" 

尝试以这样的方式需要文件。
require 'mailing_job'
class AssetsController < ApplicationController
    def some_method
        Delayed::Job.enqueue do_it(), 0, 1.minutes.from_now.getutc
    end
end

0

版本更改可能性:如果您通过非锁定的bundle从2.1.x跳转到gem的3.x版本,则可能会遇到类似的问题。


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