#ruby #chef-infra #chef-recipe #cookbook #lwrp
#ruby #шеф-инфра #шеф-рецепт #поваренная книга #lwrp
Вопрос:
У меня есть следующий атрибут в ресурсе chef:
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 в этом контексте и каково их поведение.
Ответ №1:
attribute
Метод пытается символизировать первый аргумент, который является именем атрибута. Второй аргумент выглядит как хэш опций, поэтому сигнатура метода должна выглядеть примерно так: def attribute(name, options={})
. Вы отправили массив в качестве первого аргумента, когда заключили все в скобки.
Попробуйте переформатировать его следующим образом:
attribute :attribName,
kind_of: String,
name_attribute: true,
default: 'big string sldkjslkdflksdksdlkff'
Если вам действительно не нравится этот первый аргумент в том же like, вы можете использовать splat (мне это совсем не нравится):
attribute *[
:attribName,
{
kind_of: String,
name_attribute: true,
default: 'big string sldkjslkdflksdksdlkff'
}
]
Это превратит элементы массива в аргументы.
Комментарии:
1. Если вы не используете действительно старую версию Chef, пожалуйста, используйте
property
вместоattribute
. Последнее доступно только для обратной совместимости.