2

シェフのリソースに次の属性があります。

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..] を渡すことは同じことだと考えました。なぜこれが機能しないのですか?このコンテキストでのルビ オブジェクトの属性の種類とその動作について、私は混乱していると思います。

4

1 に答える 1

2

メソッドは、属性のattribute名前である最初の引数をシンボル化しようとしています。2 番目の引数はオプションのハッシュのように見えるため、メソッド シグネチャは次のようになります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'
  }
]

これにより、配列要素が引数に変わります。

于 2016-10-02T03:12:48.167 に答える