无法调用模块方法

时间:2016-03-07 19:34:56

标签: ruby chef

我正在编写Chef cookbook来部署和应用并创建用户。它没有API,并使用奇怪的散列方法,因此我为它编写了一个简短的库模块。为简洁起见,我仅在下面列出makeSalt()方法。

module Foo_packagist
  module Password

    def makeSalt(len=31)
      require 'securerandom'
      return Digest.hexencode(SecureRandom.random_bytes((len*6/8.0).ceil)).to_i(16).to_s(36)[0..len-1]
    end

  end
end

麻烦的是,在每次厨师运行中,我得到:

NoMethodError
-------------
undefined method `makeSalt' for Foo_packagist::Password:Module

并在chef-shell调试我得到:

chef (12.4.0)> puts ::Foo_packagist::Password.instance_methods()
makeSalt
encodePassword

chef (12.4.0)> puts ::Foo_packagist::Password.makeSalt()
NoMethodError: undefined method `makeSalt' for Foo_packagist::Password:Module

chef (12.4.0)> puts ::Foo_packagist::Password::makeSalt()
NoMethodError: undefined method `makeSalt' for Foo_packagist::Password:Module

调用此方法的正确方式是什么?

2 个答案:

答案 0 :(得分:2)

将其更改为def self.makeSalt。这是模块级方法的Ruby语法。

答案 1 :(得分:1)

试试这个 - >

module Foo_packagist
  module Password

    def self.makeSalt(len=31)
      require 'securerandom'
      return Digest.hexencode(SecureRandom.random_bytes((len*6/8.0).ceil)).to_i(16).to_s(36)[0..len-1]
    end
  end
end

然后打电话给它 - >

Foo_packagist::Password.makeSalt()