Не определен вспомогательный метод библиотеки Chef

Я пытаюсь написать LWRP, где на основе условий он будет вызывать методы из вспомогательной библиотеки. У меня проблема с синтаксисом при получении провайдером чтения внешнего метода.

Провайдер довольно прост

# providers/provider.rb
require_relative '../libraries/acx_shared'
include Acx

action :create  do
  Chef::Log.debug('{jefflibrary->lwrp->user} - start')

if @new_resource.shared == true
  Acx::User::Shared.true_shared()
else
  Acx::User::Shared.false_shared()
end

if @new_resource.sudo == true
  Chef::Log.error('I HAVE THE POWER')
else
  Chef::Log.error('my power is weak and feeble')
end
if @new_resource.password == true
  Chef::Log.error('the secret password is 12345')
else
  Chef::Log.error('I will never tell you the secret to the airlock')
end

  Chef::Log.debug('{jefflibrary->lwrp->user} - end')
end

вместе с вспомогательной библиотекой

#libraries/acx_shared.rb
module Acx
  module User
    module Shared
    def true_shared
      #puts blah
      Chef::Log.error('I am pulling this from a library reference')
    end
    def false_shared
      Chef::Log.error('I am not very good at sharing')
    end
  end
end
end

но всякий раз, когда я пытаюсь запустить его независимо от установленных атрибутов ресурса, я продолжаю получать

NoMethodError
           -------------
           undefined method `false_shared' for Acx::User::Shared:Module

Мне явно чего-то не хватает в документации по написанию вспомогательной библиотеки, но я не уверен, что именно. Пытался переместить кое-что, но идеи заканчивались.


person jcarapet    schedule 28.09.2015    source источник
comment
втягивает ли acx_shared helper_library через require? это вообще тянет?   -  person Mircea    schedule 28.09.2015
comment
helper_library технически называется acx_shared.rb, но я обозначил его как helper_library, что, как я надеялся, было легче понять. Предполагается, что это поставщик .rb загружает вспомогательную библиотеку с требованием и включает модуль Acx. однако это не втягивает ни один из методов. Это синтаксис, который мне не хватает.   -  person jcarapet    schedule 28.09.2015
comment
ИМХО это не упрощает понимание.   -  person Mircea    schedule 28.09.2015
comment
попробуйте удалить include Acx. Может случиться так, что из-за того, что вы делаете, он фактически ищет внутри Acx другой модуль с именем Acx. Так что либо удалите включение, либо удалите Acx :: from вызовов * общих методов   -  person Mircea    schedule 28.09.2015


Ответы (1)


попробуйте удалить включить Acx

Может случиться так, что из-за того, что вы делаете это, он на самом деле ищет внутри Acx другое имя модуля Acx. Так что либо удалите включение, либо удалите Acx :: from вызовов * общих методов. Вы также не можете вызвать переменную экземпляра непосредственно из модуля, когда вы пытаетесь. Вам необходимо, чтобы класс включал модуль и после этого вызывал метод для объекта этого класса.
В качестве альтернативы вы можете продвигать методы в методы класса (self.), И вы можете вызывать их напрямую.

Что-то типа:

# providers/provider.rb
require_relative '../libraries/acx_shared'

action :create  do
  Chef::Log.debug('{jefflibrary->lwrp->user} - start')

acx = Class.new.exted(Acx::User::Shared)
if @new_resource.shared == true
  acx.true_shared()
else
  acx.false_shared()
end

if @new_resource.sudo == true
  Chef::Log.error('I HAVE THE POWER')
else
  Chef::Log.error('my power is weak and feeble')
end
if @new_resource.password == true
  Chef::Log.error('the secret password is 12345')
else
  Chef::Log.error('I will never tell you the secret to the airlock')
end

  Chef::Log.debug('{jefflibrary->lwrp->user} - end')
end

or

#libraries/acx_shared.rb
module Acx
  module User
    module Shared
    def self.true_shared
      #puts blah
      Chef::Log.error('I am pulling this from a library reference')
    end
    def self.false_shared
      Chef::Log.error('I am not very good at sharing')
    end
  end
end
end
person Mircea    schedule 28.09.2015
comment
Спасибо за продолжение. К сожалению, я попробовал оба подхода, но все же имел обыкновенную загадочную ошибку, которая могла произойти. ‹Blink› NoMethodError ------------- неопределенный метод `true_shared 'для Acx :: User :: Shared: Class ‹/blink› - person jcarapet; 28.09.2015
comment
верно. вы не можете вызвать это напрямую, поскольку это метод экземпляра. вам необходимо включить модуль в класс или повысить его до класса var (self. in front), если вы хотите вызвать его напрямую. Обновлены образцы кода. - person Mircea; 29.09.2015
comment
работала красиво. Уловка определенно заключается в том, чтобы заканчивать модуль, когда вы вызываете include. - person jcarapet; 30.09.2015