未初始化的常量 Delayed::Job

Posted

技术标签:

【中文标题】未初始化的常量 Delayed::Job【英文标题】:uninitialized constant Delayed::Job 【发布时间】:2011-10-02 06:24:35 【问题描述】:

我已将delayed_job gem 添加到我的gemfile 并正确安装,但是当我尝试运行以下行时:

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

我收到错误“”

有人可以解释我需要在这里做什么吗?我事先尝试过运行“rake jobs:work”,但它也返回“”错误。此外,我在文件 (application.rb) 中添加了“require 'delayed_job'”,但运气不佳。

【问题讨论】:

【参考方案1】:

如果您已升级到延迟作业版本 >=3,则需要添加此内容(假设您使用的是 ActiveRecord):

# Gemfile
gem 'delayed_job_active_record'

【讨论】:

非常有帮助 - 我遇到了这个问题。除了完成,但为了保存其他人点击它,我还必须将我的回形针用法从 gem 'aws-s3' 更新为 gem 'aws-sdk' 在此处查看“在 Active Record 上从 2.x 升级到 3.0.0”:github.com/collectiveidea/delayed_job 这解决了我移动到 Heroku 上的雪松堆栈以及 Peter 对 aws 的评论的问题。谢谢!【参考方案2】:

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

将此添加到您的 gemfile:

gem 'delayed_job_active_record'

然后在控制台运行:

$ rails generate delayed_job:active_record
$ rake db:migrate

您需要在数据库中创建延迟作业表(假设您使用的是活动记录)。

对于 Rails 3,您只需将其包含在 gemfile 中,运行上面的代码以创建表并迁移数据库,然后重新启动服务器即可!

【讨论】:

还要确保添加app/models/delayed_job.rb。不需要定义太多,只需要类本身:class DelayedJob < ActiveRecord::Base end 就可以了。 @sorens 你能确认这是一个必要的步骤吗? @just__matt 我相信是这样,但我还没有确认。启动一个新的rails项目,添加delayed_job gem,跳过模型看看。 @sorens 我正在使用 delayed_job 没有定义 DelayedJob 模型 - 我认为这不是必要的步骤 - 我建议不要这样做以避免混淆 这听起来像是一个可选步骤。我写CustomJobs 来封装我所有的delayed_job 功能。也许这就是需要它的原因。对于未来的开发人员,请在不创建模型的情况下尝试它,如果可行,您就可以参加比赛了!【参考方案3】:

我在引擎中使用延迟作业(因此 gem 是在 .gemspec 而不是 Gemfile 中指定的)并且遇到了同样的错误。我发现我可以通过以下方式解决问题:

require 'delayed_job_active_record'  # fixes problem

而不是

require 'delayed_job'                # doesn't

【讨论】:

不,它没有。关键是在引擎中我必须专门使用 require 语句。其他答案是指标准 Rails 应用程序,在 Gemfile 中使用“gem 'delayed_job_active_record'”就足够了。对于在 gemspec 中定义 gem 的引擎,情况并非如此,然后您需要在代码中需要 gem 的地方使用 require 语句。 是的,这个 require 语句可以做到!谢谢。 感谢您的回答,这在 Rails 引擎中对我有用。以防有人像我一样想知道,require 位于 engine.rb 文件的顶部。【参考方案4】:

以防万一,如果仍然没有答案,请查看以下链接

http://www.pipetodevnull.com/past/2010/4/14/uninitialized_constant_delayedjob/

编辑:替代方案,只需升级到最新版本 - 2.1

【讨论】:

这解决了我的问题,但是链接只有 1 行代码,你可以很容易地将它粘贴在这里。 延迟::Worker.backend = :active_record【参考方案5】:

我曾经在同样的问题上苦苦挣扎。我在 delay_job 上关注 ryan bates 截屏视频,并得到相同的错误“未初始化的常量 Delayed::Job”。在截屏视频中,ryan 创建了一个名为 mailing_job.rb(位于 lib 文件夹下)的文件,其中包含 delay_job perform 方法,它允许您使用 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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于未初始化的常量 Delayed::Job的主要内容,如果未能解决你的问题,请参考以下文章

未定义的方法和未初始化的常量错误

未初始化的常量 Logger (NameError)

rails 链接表“未初始化的常量”错误

HomePresenter 的未初始化常量

Rails:NameError:未初始化的常量

未初始化的常量 Twitter (NameError)