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

时间:2011-06-30 16:36:59

标签: ruby-on-rails ruby yaml mongodb

我正在使用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 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"}}

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

2 个答案:

答案 0 :(得分:1)

类似问题已经回答here

答案 1 :(得分:1)

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

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

YAML::ENGINE.yamler = 'syck'

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