【问题标题】:Trouble getting DelayedJob custom job to work: uninitialized constant UsersController::UserScrapeJob无法让 DelayedJob 自定义作业正常工作:未初始化的常量 UsersController::UserScrapeJob
【发布时间】:2013-07-19 22:23:33
【问题描述】:

很长时间以来,我一直在尝试实施 DelayedJob 自定义作业,但在网上找不到太多关于如何从头到尾执行此操作的信息,而且几乎找不到与发送大量信息无关的信息电子邮件(我已经阅读了collectiveidea 的Github 介绍、Railscasts、SO 问题等)。作为一个对 Rails 比较陌生的人,我想虽然这些说明对于更有经验的人来说可能很清楚,但对于我这个级别的人来说,这些说明还不够清楚,无法理解如何让它正常工作。

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

以前,我在控制器的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

【问题讨论】:

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


    【解决方案1】:

    您在创建作业时有一个拼写错误,类的名称是UserScrapeJob,带有大写的“U”(ruby 中的类名称是常量)。

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

    if 中还有一个语法错误,它是 if ... else ... end,而不是 if ... end else ... end

    【讨论】:

    • 不幸的是,这不起作用。它现在报告:uninitialized constant UsersController::UserScrapeJob。我确实继续删除了代码中不必要的end。
    • 那是因为你把文件放在了app/jobs下,默认是不加载的。尝试将文件移动到 app/models 或将 add/jobs 目录添加到自动加载路径。
    • 太棒了。我无法告诉您我尝试了多长时间但未能使其正常工作,现在多亏了您,它做到了。无限感谢:)
    • 更正:它有一个我刚刚修复的异常。请求通过了,但在作业结束时,user 对象不再从常规(非延迟作业)数据库中销毁。我在 DelayedJob 方法中使用的 user.destroy 方法只销毁了 DelayedJob 对象,默认情况下,它会自行销毁已完成的作业。因此,为了确保第一个对象被销毁,就在perform 方法的user.scrape 方法下,我添加了User.find(user_id).destroy。这也破坏了常规对象。
    【解决方案2】:

    尝试将您的工作文件从 userScrapeJob.rb 重命名为 user_scrape_job.rb。

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

    【讨论】:

    • 当然,这很有意义。我继续进行更改。这与@aromero 的回答相结合,使这项工作有史以来第一次。非常感谢您的建议。
    猜你喜欢
    • 2011-11-21
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多