2013-09-01 26 views
1

加載YAML數據要使用機場的名字我的種子數據庫時分析錯誤,我用application.yml定義機場的集合:的Rails + YAML:從application.yml

AIRPORTS: 
    - name: "Charles de Gaulle" 
    city: "Paris" 
    country: "France" 
    - name: "Orly" 
    city: "Paris" 
    country: "France" 

使用Rails命令(導軌c)測試,我有:

2.0.0-p247 :001 > ENV['AIRPORTS'] 
=> "[{\"name\"=>\"Charles de Gaulle\", \"city\"=>\"Paris\", \"country\"=>\"France\"}, {\"name\"=>\"Orly\", \"city\"=>\"Paris\", \"country\"=>\"France\"}]" 

這是一個字符串!然後,鍵入以下的時候,我有一個錯誤:

2.0.0-p247 :002 > YAML.load(ENV['AIRPORTS']) 
Psych::SyntaxError: (<unknown>): did not find expected ',' or '}' while parsing a flow mapping at line 1 column 2 
from /Users/Hassen/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:205:in `parse' 
from /Users/Hassen/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:205:in `parse_stream' 
from /Users/Hassen/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:153:in `parse' 
from /Users/Hassen/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:129:in `load' 
from (irb):2 
from /Users/Hassen/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start' 
from /Users/Hassen/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start' 
from /Users/Hassen/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>' 
from script/rails:6:in `require' 
from script/rails:6:in `<main>' 

我很期待(我想)是有對象的數組,這樣我就可以播種我用下面的代碼數據庫:

YAML.load(ENV['AIRPORTS']).each do |airport| 
    AirPort.create airport 
    puts 'airport created: ' << airport.name 
end 

感謝,

+1

如何導入env變量中的yml文件的內容? – apneadiving

+1

似乎內容不是'evaled',自從'eval ENV ['AIRPORTS']'ok – apneadiving

+0

它是自動導入的,因爲運行'rails c'將import.yml(和其他.yml文件導入到config文件夾中)。 – htaidirt

回答

1

使用費加羅gem這會做的伎倆:

(eval ENV["AIRPORTS"]).each do |params| 
    Airport.create! params 
    puts "Airport created: #{params["name"]}" 

我通常使用一個簡單的初始化程序load_config.rb like:

YAML.load_file(Rails.root.join('config', 'application.yml'))['AIRPORTS'].each |params| 
    Airport.create! params 
    puts "Airport created #{params['name']}" 
end