我一直试图在很长一段时间内实现一个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
答案 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。