Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby chef LW资源属性默认值如何引用其他属性?_Ruby_Chef Infra_Lwrp - Fatal编程技术网

Ruby chef LW资源属性默认值如何引用其他属性?

Ruby chef LW资源属性默认值如何引用其他属性?,ruby,chef-infra,lwrp,Ruby,Chef Infra,Lwrp,我试图将一个资源属性的默认值设置为另一个属性的值 我正在为我正在构建的tomcat cookbook定义一个资源,其中包含以下定义。我想拥有可以独立设置的“name”和“service_name”属性。当未设置服务名称时,我希望它默认为为“name”提供的内容 以下内容与我预期的不一样: attribute :name, :kind_of => String, :required => true, :name_attribute => true attribut

我试图将一个资源属性的默认值设置为另一个属性的值

我正在为我正在构建的tomcat cookbook定义一个资源,其中包含以下定义。我想拥有可以独立设置的“name”和“service_name”属性。当未设置服务名称时,我希望它默认为为“name”提供的内容

以下内容与我预期的不一样:

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"
这不是我所期望的。我希望服务名称为“foo\u bar”,除非它被明确设置

我试过了

attribute :service_name, :kind_of => String, :default => new_resource.name
attribute :service_name, :kind_of => String, :default => @new_resource.name
但这些都不能编译


有什么方法可以完成我想做的吗?

因为这些都是类级方法,所以需要使用
lazy
属性:

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

还值得注意的是:

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

这完全是多余的。这是默认的…

我无法使用Seth的“惰性”评估,但能够通过创建动态访问器方法进行模拟

另一个帖子很有用:

首先,我的资源定义文件中的定义:

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
接下来,同一资源定义文件底部的访问器块:

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
再次感谢你的帮助。我希望将来有人会觉得这很有用


里奇

谢谢。刚试过,但编译失败:“未定义的方法‘lazy’”。然而,这让我认识到,在这个上下文中,语法只是“name”,而不是“:name”或“new_resource.name”。但是,仅使用“名称”会导致延迟计算问题。我是否需要将它转换为一个动态赋值,以便“lazy”在这里被接受?不确定。也许你在用老版本的厨师?厨师长11.12。我可以在中使用'lazy'作为资源的一部分(类似于示例),但不能按照您建议的方式在默认情况下使用:子句。然而,基于您的帮助,我想我使用动态访问器方法找到了答案。我将把它贴在下面。@sethvargo正如上面的评论员所说,当我尝试它时,它完全失败了。我以为它说,
lazy
是未定义的,但现在它可以工作了,如果我提供一个block参数,它就完全可以正常工作:
:默认值=>lazy{r}“blah{r.name}
。很抱歉我试图撤回否决票,但它说除非答案被编辑,否则我不能。r是运行上下文对象吗?