Я пытаюсь преобразовать рубиновый хэш-объект в формат YAML с помощью YAML.dump (obj), но я получаю неправильный отступ даже после использования параметров дампа.
У меня есть исполняемый скрипт ruby:
#!/usr/bin/ruby
require "yaml"
require "erb"
context_path = ARGV[0]
context = YAML.load_file(context_path)['context']
def get_yaml(obj)
YAML.dump( obj['imports']['external_repositories']['credentials'] ).sub(/.*?\n/,'')
end
Стоимость - obj['imports']['external_repositories']['credentials']
составляет
{"iacbox"=>{"basic"=>{"name"=>"", "password"=>""}}, "nexus"=>{"basic"=>{"name"=>"cpreader", "password"=>"swordfish"}}}
Примечание. Я использовал вспомогательный метод, чтобы удалить "---" в начале вывода.
Шаблон ERB вызывает вышеуказанный метод get_yaml как:
credentials:
<%= get_yaml( context ) %>
Ожидаемый результат:
credentials:
iacbox:
basic:
name: ''
password: ''
nexus:
basic:
name: cpreader
password: swordfish
в то время как я ожидаю вывода как:
credentials:
iacbox:
basic:
name: ''
password: ''
nexus:
basic:
name: cpreader
password: swordfish
Как я могу получить ожидаемый результат из дампа?
🤔 А знаете ли вы, что...
Один из популярных примеров использования Rails - Twitter, который начал свою историю как Rails-приложение.
Я думаю, что проще всего вам здесь просто поместить ключ учетных данных также в хэш, т.е. изменить фрагмент шаблона так, чтобы он состоял из одной строки:
<%= get_yaml( context ) %>
И измените свой метод get_yaml на:
def get_yaml(obj)
YAML.dump({'credentials' => obj['imports']['external_repositories']['credentials']})
.sub(/.*?\n/,'')
end
Если это не сработает для вас, например, если у вас есть дополнительные ключи под ключом учетных данных, который вы не упомянули, вы также можете сделать что-то вроде этого:
def get_yaml(obj)
YAML.dump(obj['imports']['external_repositories']['credentials'])
.sub(/^---\n/,'')
.gsub(/\n/m,"\n ")
end
Где gsub(/\n/m,"\n ")
заменяет все новые строки на новую строку плюс два пробела.