为什么我用这个Ruby模块得到NoM​​ethodError?

时间:2013-01-07 22:40:13

标签: ruby module worker

我正在编写一个分布式系统,其中一个工作人员执行某项工作,并且为了启动工作人员,启动init.rb,它会加载lib文件夹并执行一些配置。

结构

init.rb
lib
|-- modulename
|   |-- foo.rb
|   |-- configuration.rb
|   `-- worker.rb
`-- modulename.rb

init.rb

$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))

require "bundler/setup"
require "modulename"

ModuleName.configure do |c|
    c.log       = "module.log"
    c.pool_size = 10
end

modulename.rb

require "sidekiq"

require "modulename/foo"
require "modulename/configuration"
require "modulename/worker"

module ModuleName
    def self.config
        @config ||= Configuration.new
    end

    def self.configure
        yield(config)
    end
end

worker.rb

module ModuleName
    class Worker
        include Sidekiq::Worker

        REDIS_POOL = ConnectionPool.new(:size => ModuleName.config.pool_size, :timeout => 3) { Redis.new }

        def dosomething
            # ...
        end
    end
end

如果我现在运行ruby init.rb,我会收到NoMethodError:<class:Worker>: undefined method config for ModuleName:Module (NoMethodError)

我真的不明白为什么,请给我一个如何解决这个问题的提示!

1 个答案:

答案 0 :(得分:1)

在modulename.rb中你需要worker.rb,所以ruby会关闭并运行该文件中的代码,包括你设置REDIS_POOL的位,它试图调用Modulename.config

Modulename.config尚未定义(您只在modulename.rb的底部执行此操作,因此错误。

您可能只想懒洋洋地创建redis池,或者至少在配置更新后创建redis池。