Что такое атрибутивные методы LWRP Chef и что я могу им передать?

#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 . Последнее доступно только для обратной совместимости.