什么是Chef LWRP的属性方法以及我可以传递哪些方法?

时间:2016-10-02 02:12:18

标签: ruby chef chef-recipe cookbook 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只是接受参数数组的方法,并且将[..args ..]传递给它是同样的事情。为什么这不起作用?我想我对这种背景下什么类型的ruby对象属性及其行为感到困惑。

1 个答案:

答案 0 :(得分:2)

attribute方法试图象征第一个参数,即属性的名称。第二个参数看起来像是一个选项的哈希,所以方法签名看起来应该是这样的:def attribute(name, options={})。当您将所有内容包装在括号内时,您发送了一个数组作为第一个参数。

尝试重新格式化:

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

如果你真的没有同样的第一个论点,你可以使用splat(我根本不喜欢这样):

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

这将把数组元素变成参数。