无法使DelayedJob自定义作业工作:未初始化的常量UsersController :: UserScrapeJob

时间:2013-07-18 20:48:36

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 delayed-job

我一直试图在很长一段时间内实现一个DelayedJob自定义作业,但是从头到尾没有找到很多关于如何做到这一点的信息,并且我发现几乎没有什么不是关于发送质量电子邮件(我读过collectiveidea的Github介绍,Railscasts,SO问题等)。作为对Rails相对较新的人,我想虽然对于经验丰富的人来说说明可能很明确,但对于我这个级别的某个人来说,他们并不清楚如何让他们能够正常工作。

我的任务的目标是运行作业,然后销毁对象(我知道DelayedJob会破坏所有已完成的作业,但我也希望在完成作业后从我的数据库中销毁该对象。)< / p>

以前,我使用我的控制器create方法中的DelayedJob非自定义作业执行此操作:user.delay.scrape,然后是user.delay.destroy,效果很好。因此,我的应用程序中的其他一切工作正常,问题严重在于我如何设置此自定义作业。但是,由于各种原因,在这种情况下创建自定义作业会好得多。

以下是我在我的应用中设置DelayedJob的当前(非工作)方式。但是,当我运行应用程序时,控制台会报告:uninitialized constant UsersController::UserScrapeJob。任何有关如何使其正常工作的建议将不胜感激,我很乐意回答有关此请求的任何问题。

这是我的模特:

class User < ActiveRecord::Base
 def scrape
  some code here...
 end
end

在我的控制器中,延迟的作业需要作为create方法的一部分。

这是我的控制器(只显示了创建方法):

class UsersController < ApplicationController
 @user = User.new(params[:user])
 if @user.save
  Delayed::Job.enqueue UserScrapeJob.new(user.id)
 else
  render :action => 'new'
 end
end

以下是userScrapeJob.rb文件夹中的作业文件app/jobs

class UserScrapeJob < Struct.new(:user_id)  
 def perform
  user = User.find(user_id)
  user.scrape
  user.destroy
 end
end

2 个答案:

答案 0 :(得分:2)

创建作业时出现拼写错误,类的名称为UserScrapeJob,大写字母为“U”(ruby中的类名称为常量)。

Delayed::Job.enqueue UserScrapeJob.new(user.id)

if,if ... else ... end,而不是if ... end else ... end

也有语法错误

答案 1 :(得分:1)

尝试将您的职位档案从userScrapeJob.rb重命名为user_scrape_job.rb

当你调用UserScrapeJob.new时,Rails会将类名转换为snake case(即user_scrape_job),并查找该名称的相应文件user_scrape_job.rb。