Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类_Ruby On Rails_Delayed Job - Fatal编程技术网

Ruby on rails 延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类

Ruby on rails 延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类,ruby-on-rails,delayed-job,Ruby On Rails,Delayed Job,我在管理一个迟到的工作人员。每当我调用foo方法时,worker都会打印hello class User def foo puts "Hello" end handle_asynchronously :foo end 如果我对foo方法进行了一些更改,我必须重新启动worker以反映更改。在开发模式中,这可能会变得非常烦人 我试图找到一种方法为每个请求重新加载有效负载类(在本例中为用户类)。在有效负载方法调用之前,我尝试通过monkey修补DelayedJob库来调用req

我在管理一个迟到的工作人员。每当我调用
foo
方法时,worker都会打印
hello

class User
  def foo
    puts "Hello"
  end
  handle_asynchronously :foo
end
如果我对
foo
方法进行了一些更改,我必须重新启动worker以反映更改。在开发模式中,这可能会变得非常烦人

我试图找到一种方法为每个请求重新加载有效负载类(在本例中为用户类)。在有效负载方法调用之前,我尝试通过monkey修补DelayedJob库来调用
require\u dependency

module Delayed::Backend::Base
  def payload_object_with_reload
    if Rails.env.development? and @payload_object_with_reload.nil?
      require_dependency(File.join(Rails.root, "app", "models", "user.rb"))
    end
    @payload_object_with_reload ||= payload_object_without_reload
  end
  alias_method_chain :payload_object, :reload
end
这种方法不起作用,因为使用
require\u dependency
注册的类需要在调用之前重新加载,而我还没有弄明白怎么做。我花了一些时间阅读dispatcher代码,以了解Rails如何为每个请求重新加载类。我找不到重新加载代码


以前有人试过吗?你建议我怎么做?或者您有没有找到Rails类重载代码的指针?

我设法找到了一个解决方案。我使用了
ActiveSupport::Dependencies.clear
方法来清除加载的类

添加名为
config/initializers/delayed_job.rb的文件

Delayed::Worker.backend = :active_record
if Rails.env.development?
  module Delayed::Backend::Base
    def payload_object_with_reload
      if @payload_object_with_reload.nil?
        ActiveSupport::Dependencies.clear
      end
      @payload_object_with_reload ||= payload_object_without_reload
    end
    alias_method_chain :payload_object, :reload
  end
end

这看起来像是在没有alias_方法hackery的情况下解决了您的问题:


从4.0.6版开始,如果
Rails.application.config.cache\u classes
设置为
false
,则DelayedJob会自动重新加载:

在开发模式下,如果您使用的是Rails 3.1+,则应用程序代码将每隔100个作业或队列结束时自动重新加载。您不再需要在每次更新开发中的代码时重新启动延迟的作业


非常感谢。这非常有效,即使使用mongoid作为后端。我只需要删除第一行就可以了:)太好了!is做了一些类似的事情,但作为一个应用程序,并将其与之结合使用,我真的不明白为什么,但这会导致我的Rails内存在所有环境(包括生产环境)和非DJ实例中膨胀。