Ruby 使用哈希键更新哈希值
我面临一个问题,我还没有找到有效的解决办法 我有用于环境的YAML配置文件,我们称之为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
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}