2016-03-07 5 views
-1

Я пишу поваренную книгу повара для развертывания и применения и создания пользователей. Он не имеет 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 

Что такое право способ вызвать этот метод ?

+0

Ваш 'require' должен быть в верхней части файла, не застрявшей внутри метода. – tadman

+0

Это образец, который мы рекомендуем для шеф-повара, где некоторые драгоценные камни могут быть недоступны во время загрузки библиотеки. 'securerandom' находится в stdlib, но его рекомендуется рекомендовать как шаблон для покрытия, чем объяснять, что есть и что не включено. – coderanger

ответ

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 

Тогда называть это будет this->

Foo_packagist::Password.makeSalt() 
+0

Ведущий '::' необходим только в случае конфликта пространства имен. – tadman

+0

Спасибо, я просто скопировал указанный код. @tadman – Snowman08

2

Изменить это на def self.makeSalt. Это синтаксис Ruby для метода на уровне модуля.

+0

Вы также можете добавить 'extend self' в конце, чтобы катить их все таким образом. – tadman

Смежные вопросы