6

我有一个想要异步处理的控制器操作。

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

当这被调用时,我得到一个:TypeError:无法转储匿名模块

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

有任何想法吗?

谢谢。

4

2 回答 2

9

延迟作业不必是 ActiveRecord 模型,您可以将功能添加到普通的旧 Ruby 类,请参阅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

这种方法允许您单独测试延迟的工作

于 2013-09-25T23:29:49.147 回答
5

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

于 2013-11-09T22:43:45.887 回答