如何在en.yml中编写引用值?

时间:2013-12-30 12:07:08

标签: ruby-on-rails ruby yaml

我正在编写一个脚本,将新的翻译添加到en.yml文件中。但是,当我将它们转储回文件时,我的字符串采用以下格式:

some_key: This is the value

我正在尝试输出:

some_key: "This is the value"

我正在写这样的翻译:

File.open(yaml_file, "w") do |f|
  f.write(translations.to_yaml)
end

翻译是包含所有翻译的哈希。

除了手动解析/重写YAML文件外,还有什么方法可以添加这些引号吗?

3 个答案:

答案 0 :(得分:5)

当标量类型不需要转义时,plan (unquotes) scalar representation是首选版本。

在您的情况下,字符串:

This is the value

不需要引号,因此,如果您提供以下YAML:

 key: "This is the value"

处理器可能会返回:

 key: This is the value

因为它们完全等同。但是,如果您确实要输入带引号的字符串作为值,则应使用:

 key: '"This is the value"'

或逃避双引号:

 key: "\"This is the value\""

我快速浏览了to_yaml def visit_Psych_Nodes_Scalar o @handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style end 调用的Psych emitter code,似乎没有强制引用标量的选项。

我甚至没有看到scalar emitter代码中实现的选项。

{{1}}

换句话说,您无法强制引用。

答案 1 :(得分:0)

更新了哈希转换

def value_stringify(hash)
  hash.each do |k,v|
    if v.kind_of? Hash
      hash[k]= value_stringify(v)
    else
      hash[k]="\"#{v}\""
    end
  end
end

现在使用转换后的哈希来存储yaml。

File.open(yaml_file, "w") do |f|
  f.write(value_stringify(translations).to_yaml)
end

现在它应该有用..

答案 2 :(得分:0)

您获得的格式是有效的YAML。但是,如果您真的想要这个,可以在转换之前暂时修改数据。

正常:

{ foo: "bar" }.to_yaml
# => foo: bar

后面有一个空格:

{ foo: "bar " }.to_yaml
# => foo: 'bar '

请注意,您会获得单引号而非双引号。因此,如果您临时修改数据,可以添加一个占位符,稍后将删除。

示例:

{ foo: "foo --REMOVE-- ", bar: "bar --REMOVE-- " }.to_yaml
.gsub(' --REMOVE-- ', '')
# => foo: 'foo'
#    bar: 'bar'