Ruby 使用哈希键更新哈希值

Ruby 使用哈希键更新哈希值,ruby,hash,Ruby,Hash,我面临一个问题,我还没有找到有效的解决办法 我有用于环境的YAML配置文件,我们称之为development.yml 此文件用于创建应更新的哈希: data = YAML.load_file(File.join(Rails.root, 'config', 'environments', 'development.yml')) 我正试图实现的是这些目标。假设我们有这样一个元素 data['server']['test']['user'] data['server']['test']['passw

我面临一个问题,我还没有找到有效的解决办法

我有用于环境的YAML配置文件,我们称之为
development.yml

此文件用于创建应更新的哈希:

data = YAML.load_file(File.join(Rails.root, 'config', 'environments', 'development.yml'))
我正试图实现的是这些目标。假设我们有这样一个元素

data['server']['test']['user']
data['server']['test']['password']
我想要的是:

data['server']['test']['user'] = #{Server.Test.User}
data['server']['test']['password'] = #{Server.Test.Password}
其思想是为每个值动态创建一个占位符,该值是该值的键映射,一直到散列的最后一级,并用映射到此值的值替换该值,从而连接键


对不起,这不能解决我的问题。位置
数据['server']['test']['user']
将通过经过嵌套哈希的循环动态构建。我发现的唯一方法是将当前哈希迭代的键附加到字符串中。最后,我有一个字符串,如
“data['server']['test']['name']”
,我正在考虑将其转换为变量
data['server']['test']['name']
,然后将值
{server.test.name}
分配给这个变量。阅读我的问题,我不确定这是否清楚,我希望这有助于澄清它

输入样本:

api: 'active'
server:
  test:
    user: 'test'
    password: 'passwordfortest'
  prod:
    user: 'nottest'
    password: 'morecomplicatedthantest'
在这种情况下,最终结果应该是以以下方式更新此yml文件:

api: #{Api}
server:
  test:
    user: #{Server.Test.User}
    password: #{Server.Test.Password}
  prod:
    user: #{Server.Prod.User}
    password: #{Server.Prod.Password}
这听起来很傻,但我想不出一个方法来做这件事。

使用:

使用:


不能将键值对添加到字符串中

data['server']['host'] # => which results in a string
备选案文1:

您可以将
Server.Host
另存为散列中的主机名

data['server']['host']['name'] = "#{Server.Host}"
data['server']['host']['user'] = "#{Server.Host.User}"
data['server']['host']['password'] = "#{Server.Host.Password}"
备选案文2:

您可以使用主机作为密钥,在单个步骤中构造哈希

data['server']['host'] = { "#{Server.Host}" => { 
                              'user' => "#{Server.Host.User}",
                              'password' => "#{Server.Host.Password}"
                            } 
                          }

不能将键值对添加到字符串中

data['server']['host'] # => which results in a string
备选案文1:

您可以将
Server.Host
另存为散列中的主机名

data['server']['host']['name'] = "#{Server.Host}"
data['server']['host']['user'] = "#{Server.Host.User}"
data['server']['host']['password'] = "#{Server.Host.Password}"
备选案文2:

您可以使用主机作为密钥,在单个步骤中构造哈希

data['server']['host'] = { "#{Server.Host}" => { 
                              'user' => "#{Server.Host.User}",
                              'password' => "#{Server.Host.Password}"
                            } 
                          }

我现在发布另一个答案,因为我意识到这个问题是关于什么的

使用gem:

需要“iteraptor”
需要“yaml”
#或从文件中加载

yaml=我现在发布另一个答案,因为我意识到这个问题是关于什么的

使用gem:

需要“iteraptor”
需要“yaml”
#或从文件中加载

yaml=Sidenote:
data['server']['host']={server.host}
data['server']['host']['user']={server.host.user}
不能同时进行。谢谢,@mudasobwa。我修正了我的问题。旁注:
data['server']['host']={server.host}
data['server']['host']['user']={server.host.user}
不能同时进行。谢谢,@mudasobwa。我修正了我的问题。对不起,我想我的问题不清楚。该位置的地图将动态生成,并且将根据该地图动态创建要更新的值。对不起,我想我的问题不清楚。该位置的映射将动态生成,并且将根据映射动态创建要更新的值。抱歉,这不能解决我的问题。位置
数据['server']['host']['name']
将通过经过嵌套哈希的循环动态构建。我找到的唯一方法是在字符串中附加散列的最后一个键。最后,我有一个字符串
“data['server']['host']['name']”
,我正在考虑将其转换为变量
data['server']['host']['name']
,然后将值
{server.host.name}
分配给这个变量。阅读我的问题,我不确定这是否清楚,我希望这有助于澄清它。我已经更新了我的问题。请显示负责这些密钥的
development.yml
部分。它没有变得更干净。您经常在哈希中提到
'host'
键,而您的示例没有任何关于它的线索。请花点时间清楚地说明,什么是输入,什么是预期输出。对于发布的示例,不需要动态创建任何哈希键,它们在输入和输出上没有区别。首先,问题中上面和下面的例子并非来自同一组。现在修好了。第二,如果你认为它们彼此没有区别,我不清楚我在问什么<代码>用户:#{Server.Test.user}
是一个输出示例,其中没有插值
#{Server.Test.User}
是一个占位符,它将被另一个工具完全替换,最后将是
用户:“Test”
。这不是问题的一部分,但这是这个脚本的全部原因。对不起,它不能解决我的问题。位置
数据['server']['host']['name']
将通过经过嵌套哈希的循环动态构建。我找到的唯一方法是在字符串中附加散列的最后一个键。最后,我有一个字符串
“data['server']['host']['name']”
,我正在考虑将其转换为变量
data['server']['host']['name']
,然后将值
{server.host.name}
分配给这个变量。阅读我的问题,我不确定这是否清楚,我希望这有助于澄清它。我已经更新了我的问题。请显示负责这些密钥的
development.yml
部分。它没有变得更干净。您经常在哈希中提到
'host'
键,而您的示例没有任何关于它的线索。请花点时间清楚地说明,什么是输入,什么是预期输出。对于发布的示例,不需要动态创建任何哈希键,它们在输入和输出上没有区别。首先,问题中上面和下面的例子并非来自同一组。现在修好了。第二,如果你认为它们彼此没有区别,我不清楚我在问什么<代码>用户:#{Server.Test.user}
是一个输出示例,其中没有插值<代码>{Server.Test.User}