Ruby脚本:未定义的方法“symbol#u键';加载YAML文件时出错

Ruby脚本:未定义的方法“symbol#u键';加载YAML文件时出错,ruby,scripting,yaml,Ruby,Scripting,Yaml,我有一个用于yaml合并的ruby脚本,如下所示 #!/usr/bin/env ruby require 'yaml' raise "wrong number of parameters" unless ARGV.length == 2 y1 = YAML.load_file(ARGV[0]).symbolize_keys y2 = YAML.load_file(ARGV[1]).symbolize_keys puts y1.merge!(y2).to_yaml 当我执行它时: ./te

我有一个用于yaml合并的ruby脚本,如下所示

#!/usr/bin/env ruby

require 'yaml'

raise "wrong number of parameters" unless ARGV.length == 2

y1 = YAML.load_file(ARGV[0]).symbolize_keys
y2 = YAML.load_file(ARGV[1]).symbolize_keys
puts y1.merge!(y2).to_yaml
当我执行它时:

./test.rb ./src/api/config/config1.yml ./src/api/config/config2.yml
我有以下错误:

./test.rb:5:in `<main>': undefined method `symbolize_keys' for {"root"=>{"cloud.n2"=>{"accessKey"=>"I5VAJUYNR4AAKIZDH777"}}}:Hash (NoMethodError)
/test.rb:5:in`':未定义的{“root”=>{“cloud.n2”=>{“accessKey”=>“I5VAJUYNR4AAKIZDH777”}}的方法`符号化}:散列(NoMethodError)
方法来自
activesupport
gem(activesupport/lib/active\u support/core\u ext/hash/keys.rb)

为了使用它,您需要在脚本中添加以下行:

require "active_support"

虽然其他答案/评论都是正确的,但要求所有的
ActiveSupport
来实现这一点似乎有些过分。相反,请使用:

require 'active_support/core_ext/hash/keys' 
或者,如果您可以控制yml文件,则只需在其中创建键符号,并避免任何转换。比如说

require 'yaml'
yml = <<YML
:root:
  :cloud.n2:
    :accessKey: "I5VAJUYNR4AAKIZDH777"
YML
YAML.load(yml)
#=> {:root=>{:"cloud.n2"=>{:accessKey=>"I5VAJUYNR4AAKIZDH777"}}}
需要“yaml”
yml={:“cloud.n2”=>{:accessKey=>“I5VAJUYNR4AAKIZDH777”}}

这并不能真正回答您的问题,但是引入了Ruby 2.5.0(),它也可以用来表示键,并且是核心Ruby

{'a' => 1, 'b' => 2}.transform_keys(&:to_sym)
#=> {:a=>1, :b=>2}

还有一个bang版本,它改变了散列,而不是创建一个新的散列。

正如其他人已经指出的,
symbol\u keys
是一种
ActiveSupport
方法。如果您没有使用
ActiveSupport
,和/或在不包含
transform\u键的Ruby 2.5之前版本上,您可以自己定义它

class Hash

  def transform_keys
    return enum_for(:transform_keys) unless block_given?
    result = self.class.new
    each_key do |key|
      result[yield(key)] = self[key]
    end
    result
  end

  def transform_keys!
    return enum_for(:transform_keys!) unless block_given?
    keys.each do |key|
      self[yield(key)] = delete(key)
    end
    self
  end

  def symbolize_keys
    transform_keys{ |key| key.to_sym rescue key }
  end

  def symbolize_keys!
    transform_keys!{ |key| key.to_sym rescue key }
  end
end

这并不是说您的脚本可能不需要其他对Rails或ActiveSupport的依赖关系。

是否安装了Rails?
symbol\u key
来自Rails中的ActiveSupport。您还需要
活动支持。