延迟求职法

Delayed Job seeking method

我在 Ruby 的模块中有一个模块,类似于:

Module Foo
  Module Bar
    def do_thing_as_delayed_job(my_id, my_option_array)
      Delayed::Job.enqueue Foo::Bar.do_thing(my_id, my_option_array)
    end
    def do_thing(my_id, my_option_array)
      Rails.logger.info("Yay, I got here!")
    end
  end
end

我尝试启动延迟的作业启动器。然而,当我 运行 do_thing_as_delayed_job,我得到这个:

NoMethodError: undefined method `do_thing' for Foo::Bar:Module

我不知道为什么它在'Module'中搜索,如何使它运行成为我想要的方法。我在 Ruby 还是个新手。谢谢!

Foo::Bar.do_thing 在模块本身上调用 do_thing。您已将此方法定义为 def do_thing,使其成为实例方法。这意味着要调用 do_thing,您需要有一个 class 的实例,该实例将此模块混合在 (1) 中,或者您需要将此方法更改为模块方法 (2)。

(1) 的代码

class A
  include Foo::Bar
end

module Foo
  module Bar
    def do_thing_as_delayed_job(my_id, my_option_array)
      Delayed::Job.enqueue A.new.do_thing(my_id, my_option_array)
    end
    def do_thing(my_id, my_option_array)
      Rails.logger.info("Yay, I got here!")
    end
  end
end

(2) 的代码:


module Foo
  module Bar
    def do_thing_as_delayed_job(my_id, my_option_array)
      Delayed::Job.enqueue A.new.do_thing(my_id, my_option_array)
    end
    def self.do_thing(my_id, my_option_array)
      Rails.logger.info("Yay, I got here!")
    end
  end
end

请注意,在这两种情况下,module 都是小写字母。