我有一个控制器动作,我想异步处理。
class CollectionsController < ApplicationController
def add
#code
end
handle_asynchronously :add
当这个叫做时,我得到一个: TypeError:无法转储匿名模块
delayed_job文档不清楚该方法是否必须是ActiveRecord模型方法。我见过人们使用其他类来处理这个问题的例子,但是我的方法使用了会话信息。我不清楚这些信息是否可供其他班级使用。
有什么想法吗?
感谢。
答案 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。将其移动到模型中。