未初始化的常量 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的主要内容,如果未能解决你的问题,请参考以下文章