【问题标题】:Improper indentation in converting ruby hash to yaml将 ruby​​ 哈希转换为 yaml 时缩进不当
【发布时间】:2018-12-07 05:30:22
【问题描述】:

我正在尝试使用 YAML.dump(obj) 将 ruby​​ 哈希对象转换为 YAML 格式,但即使在使用转储选项后,我也出现了不正确的缩进。

我有以下可执行的 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"}}}

注意:我使用 sub 方法在输出开头删除“---”

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

如何从转储中获得预期的输出?

【问题讨论】:

  • 欢迎来到Stack Overflow。问一个问题时,让它直接和关于编程。询问某人是否可以帮助您通常可以回答是或否(这是关于某人能力的问题,而不是关于编程的问题)。一个好的开始方式是“我如何...”您还应该让您的问题更简单obj['imports']['external_repositories']['credentials'] 是您最初遇到问题的详细信息,但不会让您的问题更清楚。将问题简化为最小案例以重现它,通常有助于发现问题,而且它肯定会让其他人更容易

标签: ruby-on-rails yaml erb


【解决方案1】:

我认为您在这里做的最简单的事情就是将凭据密钥也放入哈希中,即更改您的模板 sn-p 使其成为一行:

<%= 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 ") 将所有换行符替换为一个换行符加两个空格。

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2014-04-30
    • 2013-11-28
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2011-06-29
    相关资源
    最近更新 更多