ruby-on-rails – 延迟作业:如何在开发模式下的每个通话期间重新加载有效载荷类

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 延迟作业:如何在开发模式下的每个通话期间重新加载有效载荷类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在延迟工作.当我调用foo方法时,工作人员打印出你好.
class User
  def foo
    puts "Hello"
  end
  handle_asynchronously :foo
end

如果我对foo方法进行了一些更改,我必须重新启动这个工作来进行更改以反映出来.在开发模式下,这可能变得相当麻烦.

我正在尝试为每个请求找到一种重新加载有效负载类(在这种情况下是用户类)的方法.我试图在补丁方法调用之前,修补DelayedJob库来调用require_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_dependency注册的类需要在调用之前重新加载,我还没有想到如何做.我花了一些时间阅读调度程序代码,以了解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
原文链接:/ruby/272810.html

猜你在找的Ruby相关文章