无法读取和绑定 ruby 中的 yml 数据
Trouble reading and binding yml data in ruby
我有一个包含以下内容的 yaml 文件:
:common
:substitue
:foo: fee
我读这些数据是这样的:
data = YAML.load(erb_data[File.basename(__FILE__, '.*')].result(binding))
common = data[:common]
def substitute_if_needed(original_value)
mapping = common.dig(:substitue, original_value)
if mapping.nil? ? original_value : mapping
end
不幸的是,这没有进行我想要的替换。我想打电话给 substitute_if_needed('foo')
并让 'fee' 回来。我也想打电话给 substitute_if_needed('bar')
并取回 'bar'。
我该怎么做?
你的代码有几个问题:
- YAML 示例看起来有问题。正确的应如下所示:
common:
substitute:
foo: fee
您正在尝试使用符号作为键来获取 common = data[:common]
中的 common
键,但它应该是一个字符串 (data["common"]
)。另外,我认为将获取逻辑分成两部分是个坏主意 - 首先将 "common" 提取到 substitute_when_needed
之外,然后将 dig
提取到其中。
if
语句已损坏。它应该是正确的 if
或正确的三元运算符。
解决所有这些问题会给我们带来类似的东西(为了方便,我刚刚用 StringIO 替换了一个文件 - 使代码段按原样可执行):
yaml = StringIO.new(<<~DATA)
common:
substitute:
foo: fee
DATA
def substitute_if_needed(data, original_value)
mapping = data.dig("common", "substitute", original_value)
mapping.nil? ? original_value : mapping
end
data = YAML.load(yaml)
substitute_if_needed(data, "foo") # => "fee"
substitute_if_needed(data, "bar") # => "bar"
我有一个包含以下内容的 yaml 文件:
:common
:substitue
:foo: fee
我读这些数据是这样的:
data = YAML.load(erb_data[File.basename(__FILE__, '.*')].result(binding))
common = data[:common]
def substitute_if_needed(original_value)
mapping = common.dig(:substitue, original_value)
if mapping.nil? ? original_value : mapping
end
不幸的是,这没有进行我想要的替换。我想打电话给 substitute_if_needed('foo')
并让 'fee' 回来。我也想打电话给 substitute_if_needed('bar')
并取回 'bar'。
我该怎么做?
你的代码有几个问题:
- YAML 示例看起来有问题。正确的应如下所示:
common:
substitute:
foo: fee
您正在尝试使用符号作为键来获取
common = data[:common]
中的common
键,但它应该是一个字符串 (data["common"]
)。另外,我认为将获取逻辑分成两部分是个坏主意 - 首先将 "common" 提取到substitute_when_needed
之外,然后将dig
提取到其中。if
语句已损坏。它应该是正确的if
或正确的三元运算符。
解决所有这些问题会给我们带来类似的东西(为了方便,我刚刚用 StringIO 替换了一个文件 - 使代码段按原样可执行):
yaml = StringIO.new(<<~DATA)
common:
substitute:
foo: fee
DATA
def substitute_if_needed(data, original_value)
mapping = data.dig("common", "substitute", original_value)
mapping.nil? ? original_value : mapping
end
data = YAML.load(yaml)
substitute_if_needed(data, "foo") # => "fee"
substitute_if_needed(data, "bar") # => "bar"