2016-10-02 1 views
2

У меня есть следующий атрибут в качестве ресурса повара:Что такое методы атрибутов шеф-повара LWRP и что я могу передать им?

attribute :attribName, kind_of: String, name_attribute: true, default: 'big string sldkjslkdflksdksdlkff' 

Я хочу разбить это так, это выглядит хорошо, так что я сделал это:

attribute [ 
    :attribName, 
    kind_of: String, 
    name_attribute: true, 
    default: 'big string sldkjslkdflksdksdlkff' 
] 

Но я получаю сообщение об ошибке при сходящихся:

NoMethodError 
    ------------- 
    undefined method `to_sym' for #<Array:0x00000004a63b60> 
    Did you mean? to_s 
      to_yaml 
      to_set 

    Platform: 
    --------- 
    x64-mingw32  

    Running handlers: 
    [2016-10-01T19:07:39-07:00] ERROR: Running exception handlers 
    Running handlers complete 
    [2016-10-01T19:07:39-07:00] ERROR: Exception handlers complete 
    Chef Client failed. 0 resources updated in 11 seconds 
    [2016-10-01T19:07:39-07:00] FATAL: Stacktrace dumped to C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/chef-stacktrace.out 
    [2016-10-01T19:07:39-07:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report 
    [2016-10-01T19:07:39-07:00] FATAL: NoMethodError: undefined method `to_sym' for #<Array:0x00000004a63b60> 
    Did you mean? to_s 
      to_yaml 
      to_set 

Так я думал attribute s в файлах ресурсов были только методы, которые приняли массив аргументов и прохождения [..args ..] к ней было то же самое , Почему это не работает? Я думаю, что я смущен тем, что такое атрибуты объекта ruby ​​в этом контексте и каково их поведение.

ответ

2

Метод attribute пытается символизировать первый аргумент, который является именем атрибута. Второй аргумент кажется хэшем опций, поэтому подпись метода должна выглядеть примерно так: def attribute(name, options={}). Вы отправили Array в качестве первого аргумента, когда вы завернули все в скобки.

Попробуйте переформатировать это так:

attribute :attribName, 
    kind_of: String, 
    name_attribute: true, 
    default: 'big string sldkjslkdflksdksdlkff' 

Если вы действительно не что первый аргумент в том же, как вы можете использовать знак (я не люблю это вообще):

attribute *[ 
    :attribName, 
    { 
    kind_of: String, 
    name_attribute: true, 
    default: 'big string sldkjslkdflksdksdlkff' 
    } 
] 

Это превратит элементы массива в аргументы.

+1

Если вы не используете действительно старую версию шеф-повара, используйте 'property' вместо' attribute'. Последний доступен только для обратной совместимости. – coderanger