gpt4 book ai didi

ruby-on-rails - Chef、ruby 哈希和模板

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:54 34 4
gpt4 key购买 nike

我知道这比 chef 更像是一个 ruby 问题,但是...

我有一些属性,例如:

default['my_cookbook']['some_namespace1']['some_attribute1'] = 'some_value1'
default['my_cookbook']['some_namespace1']['some_attribute2'] = 'some_value2'
default['my_cookbook']['some_namespace1']['some_attribute2'] = 'some_value3'
...
default['my_cookbook']['some_namespace2']['some_attribute1'] = 'some_value1'
default['my_cookbook']['some_namespace2']['some_attribute2'] = 'some_value2'
default['my_cookbook']['some_namespace2']['some_attribute2'] = 'some_value3'
...

另一方面,我正在创建这样的模板资源:

template 'template_name' do
source 'template_source.erb'
variables (
my_namespace_1: node['my_cookbook']['some_namespace1'],
my_namespace_2: node['my_cookbook']['some_namespace2']
)
end

然后在 template_source.erb 中我尝试:

...
<%= @my_namespace_1['some_attribute1'] %> #=> 'some_value1'
...

但是,当我运行 Kitchen 时,我得到的不是 'some_value1':

Chef::Mixin::Template::TemplateError
------------------------------------
undefined method `[]' for nil:NilClass

我应该如何发送模板变量以这种方式使用它?

最佳答案

编辑:这仅适用于一般的 Ruby,不适用于 Chef。

传递嵌套哈希:

template 'template_name' do
source 'template_source.erb'
variables (
my_namespace_1: {
some_attribute1: node['my_cookbook']['some_namespace1']['some_attribute1']
}
)
end

但与其逐字复制值,不如使用 Hash class 的全部功能随心所欲地切片、切 block 和合并:

template 'template_name' do
source 'template_source.erb'
variables (
node['my_cookbook'].slice('some_namespace1', 'some_namespace2')
)
end

您在 Ruby 中遇到的一个陷阱是符号通常用作哈希键:

# newer literal syntax
a_hash = {
foo: 'bar'
}

# or with the older hash-rocket syntax
a_hash = {
:foo => 'bar'
}

符号非常有效,因为它们是存储在表中的驻留字符串 - 比较符号时,您比较的是对象 ID,而不是比较字符串中的每个字符。

事实上,只有当您希望散列中的键不是有效的 Ruby 符号时,才真正使用字符串 - 例如构建 HTTP header 的散列时。

Ruby 不会区别对待符号和字符串键:

{
foo: 'bar'
}[:foo]
# => bar

{
foo: 'bar'
}['foo']
# => nil

因此,要访问模板中传递的变量,您将使用:

<%= @my_namespace_1[:some_attribute1] %>

关于ruby-on-rails - Chef、ruby 哈希和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582408/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com