0

我正在尝试为我的 Amazon OpsWorks 堆栈创建厨师食谱。我想将自定义 JSON 数据传递到堆栈中,并让配方创建一个 .ini 文件以与 PHP 的 parse_ini_file() 命令一起使用。

我有什么工作

目前,我可以使用以下内容创建一个平面 .ini 文件:

JSON:

{
    "settings_ini": {
        "quantity": 1,
        "width": 10,
        "height": 20
    }
}

生成的 settings.ini 文件是:

quantity = 1
width = 10
height = 20

厨师食谱:

template "/my/path/here/settings.ini" do
    owner  "www_data"
    group  "www_data"
    mode   "0644"
    source "settings.ini.erb"
    variables({
        :settings_ini => node[:settings_ini]
    })
end

厨师模板“settings.ini.erb”:

<% @settings_ini.each do |name, value| -%>
<%= name %> = <%= value %>
<% end -%>

我想要做什么

我想将我的 JSON 数据更改为:

{
    "settings_ini": {
        "quantity": 1,
        "attributes": {
            "width": 10,
            "height": 20
        }
    }
}

我希望我的结果 settings.ini 文件是这样的:

quantity = 1

[attributes]
width = 10
height = 20

或者,也可能是这样的:

quantity = 1
[attributes]width = 10
[attributes]height = 20

我需要帮助修改我的 settings.ini.erb 模板文件以正确使用嵌套的 JSON 数据。

4

2 回答 2

1

您可以使用递归函数。

坚持这个libraries/hash_to_ini.rb

def hash_to_ini(hash, lines = [])
  hash.each do |name, value|
    unless value.is_a? Hash
      lines << "#{name} = #{value}"
    else
      lines << "[#{name}]"
      lines = hash_to_ini(value, lines)
    end
  end
  return lines
end

然后在您的模板中:

<% hash_to_ini(@settings_ini).each do |line| -%>
<%= line %>
<% end -%>
于 2013-08-27T12:34:13.910 回答
0

为什么不只是第二个each循环?

<% @settings_ini.each do |section, data| -%>
[<%= section %>]
<% data.each do |name, value| -%>
<%= name %> = <%= value %>
<% end -%>
<% end -%>

这段代码未经测试..但我想它应该可以工作。

您还可以添加一些安全性,例如此处此处

于 2013-08-27T07:25:54.803 回答