2011-06-30 47 views
1

我正在配置Rails和MongoDB,並在配對config/mongo.yml文件時發現一個奇怪的問題。在Rails中加載YAML配置文件時出錯

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是以正確的方式解析。

{"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"}} 

我想知道什麼可能是這個問題的原因。有任何想法嗎?謝謝。

回答

1

根據您的系統,紅寶石可能已被編譯Psych支持,替換了舊Syck解析器。您看到的問題(僅涉及使用默認的「幹」yaml文件)已在Psych中修復,但尚未發佈Ruby版本。

現在,您可以強制YAML解析器將這個標籤在你的boot.rb結束使用SYCK代替精極度緊張(但要小心 - 紅寶石的未來版本將不再包括SYCK):

YAML::ENGINE.yamler = 'syck' 

或者你可以暫時使用非DRY YAML文件(沒有默認值)。