5

我正在尝试将一个资源属性的默认值设置为另一个属性的值。

我正在为我正在构建的 tomcat 食谱定义一个包含以下定义的资源。我想拥有可以独立设置的“名称”和“服务名称”属性。如果未设置服务名称,我希望它默认为“名称”提供的任何内容。

以下不符合我的预期:

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

注意第二行末尾的 ":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 的“惰性”评估,但能够通过创建动态访问器方法进行模拟。

这篇其他帖子很有用:如何在厨师 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 回答