5

あるリソース属性のデフォルト値を別の属性の値に設定しようとしています。

作成中のTomcatクックブック用に、次の定義を含むリソースを定義しています。個別に設定できる「name」属性と「service_name」属性が必要です。サービス名が設定されていない場合、「名前」に指定されているものをデフォルトにしたい。

以下は期待どおりに機能しません。

attribute :name,         :kind_of => String, :required => true, :name_attribute => true
attribute :service_name, :kind_of => String, :default => :name

2 行目の末尾にある ":default => :name" に注意してください。レシピの新しいブロックで自分のリソースを参照するとき

my_tomcat "install tomcat" do
  name "foo_bar"
end

属性値は次のように割り当てられます

 name = "foo_bar"
 service_name = "name"

これは私が期待したものではありません。明示的に設定されていない限り、service_name を「foo_bar」にしたかったのです。

私はもう試した

attribute :service_name, :kind_of => String, :default => new_resource.name
attribute :service_name, :kind_of => String, :default => @new_resource.name

しかし、それらはコンパイルされません。

私がやろうとしていることをする方法はありますか?

4

2 に答える 2

8

lazyこれらはクラスレベルのメソッドであるため、次の属性を使用する必要があります。

attribute :service_name, kind_of: String, default: lazy { |r| r.name }

また、次の点にも注意してください。

attribute :name, kind_of: String, required: true, name_attribute: true

完全に冗長です。それがデフォルトです...

于 2014-06-04T14:18:03.590 に答える
2

Seth の "lazy" 評価は使用できませんでしたが、動的アクセサー メソッドを作成することでシミュレートできました。

この他の投稿は役に立ちました:シェフLWRP定義で動的属性のデフォルトを実装する方法

まず、私のリソース定義ファイルの定義:

attribute :service_name,        :kind_of => String, default: nil

次に、同じリソース定義ファイルの下部にあるアクセサー ブロック:

def service_name( arg=nil )
  if arg.nil? and @service_name.nil?
    set_or_return( :service_name, @name, :kind_of => String)
  else
    set_or_return( :service_name, arg, :kind_of => String )
  end
end

これにより、プロバイダー コードで初めて使用されるときに「service_name」の値が効果的に設定されます。

これは、次のすべての組み合わせで機能します。

resource "title" do
  # name defaults to "title"
  # service_name defaults to "title"
end
resource "title" do
  name "my_name"
  # service_name defaults to "my_name"
end
resource "title" do
  name "my_name"
  service_name "my_service_name"
end

再度、ご協力いただきありがとうございます。他の誰かが将来これが役立つことを願っています。

リッチ

于 2014-06-04T17:34:44.067 に答える