我正在使用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
从配置文件中我们可以看到对象development
和test
都应该有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 console
,而是以正确的方式解析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"}}
我想知道这个问题可能是什么原因。有任何想法吗?感谢。
答案 0 :(得分:1)
类似问题已经回答here
答案 1 :(得分:1)
根据您的系统,Ruby可能已经使用Psych
支持编译,它取代了旧的Syck
解析器。您正在看到的问题(仅涉及使用带有默认值的“干”yaml文件)已在Psych
中修复,但尚未发布的Ruby版本。
现在,您可以强制YAML解析器使用Syck而不是Psych,方法是将它放在boot.rb的末尾(但要注意 - Ruby的未来版本将不再包含Syck):
YAML::ENGINE.yamler = 'syck'
或者您可以暂时使用非DRY YAML文件(没有默认值)。