在Rails中加载YAML配置文件时出错

我正在使用MongoDB配置Rails,并在配对config/mongo.yml文件时发现一个奇怪的问题。

config/mongo.yml是通过执行script/rails generate mongo_mapper:config ,如下所示:

 defaults: &defaults host: 127.0.0.1 port: 27017 development: <<: *defaults database: tc_web_development test: <<: *defaults database: tc_web_test 

从配置文件中我们可以看到对象developmenttest都应该有一个database字段。 但是当它在config/initializers/mongo.db解析并加载时,

 config = YAML::load(File.read(Rails.root.join('config/mongo.yml'))) puts config.inspect MongoMapper.setup(config, Rails.env) 

奇怪的是: puts config.inspect的输出是

 {"defaults"=>{"host"=>"127.0.0.1", "port"=>27017}, "development"=>{"host"=>"127.0.0.1", "port"=>27017}, "test"=>{"host"=>"127.0.0.1", "port"=>27017}} 

它不包含database属性。 但是当我在普通的ruby控制台中执行相同的语句时,不是使用rails consolemongo.yml以正确的方式解析mongo.yml

 {"defaults"=>{"host"=>"127.0.0.1", "port"=>27017}, "development"=>{"host"=>"127.0.0.1", "port"=>27017, "database"=>"tc_web_development"}, "test"=>{"host"=>"127.0.0.1", "port"=>27017, "database"=>"tc_web_test"}} 

我想知道这个问题可能是什么原因。 有任何想法吗? 谢谢。

类似的问题已在这里得到解答

根据您的系统,Ruby可能已经使用Psych支持编译,它取代了旧的Syck解析器。 您所看到的问题(仅涉及使用带有默认值的“干”yaml文件)已经在Psych修复,但尚未发布在Ruby版本中。

现在,您可以强制YAML解析器使用Syck而不是Psych,将其放在boot.rb的末尾(但要注意 – Ruby的未来版本将不再包含Syck):

 YAML::ENGINE.yamler = 'syck' 

或者您可以暂时使用非DRY YAML文件(没有默认值)。