【问题标题】:How to convert symbols to strings (i.e. strip leading :) ruby to_yaml如何将符号转换为字符串(即剥离前导:) ruby​​ to_yaml
【发布时间】:2019-01-11 10:38:01
【问题描述】:

我正在尝试从我的 YAML 输出中删除前导 :。这是代码和我在下面所做的:

model/attribution_channel.rb

DEFAULT_BONUS_CONFIG =  {
  sign_up: {
    currency: 'ngn',
    type: 'flat',
    amount: 1000
  },
  visit: {
    currency: 'ngn',
    type: 'flat',
    amount: 5
  }
}

查看/form.slim.html

AttributionChannel::DEFAULT_BONUS_CONFIG.to_yaml

输出:

要从我的输出中删除 YAML 分隔符 ---Leading : in the keys,这是我所做的:

AttributionChannel::DEFAULT_BONUS_CONFIG.to_yaml.gsub("---\n", '').sub(":", '')

..但.sub(":", '') 部分仅删除了第一个前导::

如何从我的 YAML 输出中删除前导 :?任何帮助表示赞赏?下面是我想要的:

sign_up:
  currency: ngn
  type: flat
  amount: 1000
visit:
  currency: ngn
  type: flat
  amount: 5

【问题讨论】:

  • 只需调用 .to_s
  • @wasipeer 在这个 YAML 上调用 .to_s 不会正常工作
  • 使用 .gsub(":", '') 代替 .sub(":", '')
  • 如果您不希望键成为符号,为什么在第一种情况下将它们设为符号?
  • @Jörg W Mittag 非常感谢。这就是目前的想法。但是让它符号在我看来只是看起来更干净,这就是我没有将常量设为字符串的原因。

标签: ruby-on-rails ruby ruby-on-rails-4 yaml


【解决方案1】:

您需要将键作为字符串来跳过: 生成

require 'active_support/core_ext/hash/keys'
require 'yaml'

DEFAULT_BONUS_CONFIG.deep_stringify_keys.to_yaml.gsub("---\n", '')

 => "sign_up:\n  currency: ngn\n  type: flat\n  amount: 1000\nvisit:\n  currency: ngn\n  type: flat\n  amount: 5\n"

【讨论】:

    【解决方案2】:

    您可以在生成 YAML 之前将哈希键转换为字符串。下面的代码通过一个哈希递归地将每个键转换为哈希,如果它是一个哈希,则对每个值进行字符串化(请注意,它没有为哈希中的循环依赖做好准备)。

    def stringify(hash)
      hash.map{|k, v| [k.to_s, v.is_a?(Hash) ? stringify(v) : v] }.to_h
    end  
    
    puts stringify(DEFAULT_BONUS_CONFIG).to_yaml
    
    ---
    sign_up:
      currency: ngn
      type: flat
      amount: 1000
    visit:
      currency: ngn
      type: flat
      amount: 5
    

    编辑:关于开头的---,请参阅this answer

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      相关资源
      最近更新 更多