Проблемы с чтением и привязкой данных yml в ruby - PullRequest
0 голосов
/ 03 июня 2019

У меня есть файл 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') и получить обратно плату.Я также хочу позвонить substitute_if_needed('bar') и вернуть 'bar' обратно.

Как я могу это сделать?

1 Ответ

3 голосов
/ 03 июня 2019

В вашем коде есть несколько проблем:

  1. Пример 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"
...