В вашем коде есть несколько проблем:
- Пример YAML выглядит неработающим.Правильный должен выглядеть так:
common:
substitute:
foo: fee
Вы пытаетесь получить common
ключ common = data[:common]
, используя символ в качестве ключа, но это должна быть строка (data["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"