Rails 3 delayed_job“TypeError:无法转储匿名模块”

时间:2013-08-29 14:06:39

标签: ruby-on-rails-3 delayed-job background-process

我有一个控制器动作,我想异步处理。

class CollectionsController < ApplicationController
    def add
    #code
    end
    handle_asynchronously :add

当这个叫做时,我得到一个: TypeError:无法转储匿名模块

delayed_job文档不清楚该方法是否必须是ActiveRecord模型方法。我见过人们使用其他类来处理这个问题的例子,但是我的方法使用了会话信息。我不清楚这些信息是否可供其他班级使用。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:9)

延迟作业不必是ActiveRecord模型,您可以将功能添加到普通的旧类,请参阅https://github.com/collectiveidea/delayed_job#custom-jobs

您可能不希望异步处理控制器操作,因为这会给HTTP请求添加不必要的延迟。我的建议是在控制器中排队一个工作,如下:

class CollectionsController < ApplicationController
  def add
    Delayed::Job.enqueue CollectionBuilderJob.new(@current_user.session_info)
  end
end

class CollectionBuilderJob < Struct.new(:session_info)
  def perform
    #code
  end
end

此方法允许您单独测试延迟的作业

答案 1 :(得分:5)

您无法在控制器方法上使用DJ。将其移动到模型中。