【问题标题】:Rails 3 delayed_job "TypeError: can't dump anonymous module"Rails 3 延迟作业“类型错误:无法转储匿名模块”
【发布时间】:2013-09-02 00:28:43
【问题描述】:

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

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

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

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

有什么想法吗?

谢谢。

【问题讨论】:

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


【解决方案1】:

延迟作业不必是 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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你能否扩展你的答案,为什么会这样?这似乎是正确的。另外,为什么只将它放在模型中?为什么不是静态单例?
    • 如果您将方法设为类方法,则可以,请参见此处:stackoverflow.com/questions/12956661/…
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多