2014-03-12 217 views
2

我申請YAML.load_file我的示例文件:迭代一個YAML陣列紅寶石

--- 
languages: 
    - name: "English" 
    iso_639: "en" 
    native_name: "English" 
    region: 
     - '' 
     - UK 
     - US 
    - name: "Klingon" 
    iso_639: "tlh" 
    native_name: "tlhIngan Hol" 
    region: 
     - notearth 

我想要遍歷儘管這些語言和區域陣列。這是行不通的:

records.each do |record| 
    record.region.each do |region| 
    self.create! 
    end 
end 

record.region給我一個地區未知的方法錯誤。我怎樣才能遍歷語言和他們的地區?或者,我如何訪問區域數組?

+1

你究竟是「這行不通」是什麼意思?你得到一個錯誤?你得到的結果不是你所期望的? – toro2k

+0

我編輯了我的問題,所以最小化了實際問題。 –

回答

2

有兩個錯誤在你的代碼:

  1. 加載YAML文件後得到的對象不是數組,它是一個散列,比如說這個文件叫做foo.yml

    YAML.load_file('foo.yml') 
    # => {"languages"=>[{"name"=>"English", "iso_639"=>"en", ... 
    

    因此,你必須修改如下代碼,使其工作:

    records['languages'].each do |record| 
        # ... 
    
  2. region不是哈希record的方法,這是一個關鍵,你必須使用record['region']訪問相關值。

,你必須使用正確的代碼是:

records['languages'].each do |record| 
    record['region'].each do |region| 
    # My guess is you are going to use `region` inside this block 
    self.create! 
    end 
end 
2

YAML裝入一個哈希值,因此這將是形式:

languages: [ 
{ 
    name: "English" 
    iso_639: "en" 
    native_name: "English" 
    region: ['', 'UK', 'US'] 
} 
{ 
    name: "Klingon" 
    iso_639: "tlh" 
    native_name: "tlhIngan Hol" 
    region: ['notearth'] 
}] 

所以,你需要重複這樣的:

results = YAML.load_file(file) 
results['languages'].flat_map{|l| l['region']}.each do |region| 
    self.create! 
end 
+0

是#symbolize_keys一個Rails擴展嗎? –

+0

@WayneConrad是的,它是 – DickieBoy

+0

謝謝。我提到它是因爲OP沒有用Rails標記問題。當然,Ruby的大部分問題都是關於Rails的。 –

0
CONFIG = YAML.load_file("file.yml") 
puts CONFIG # {"languages"=>[{"name"=>"English", "iso_639"=>"en", "native_name"=>"English", "region"=>["", "UK", "US"]}, {"name"=>"Klingon", "iso_639"=>"tlh", "native_name"=>"tlhIngan Hol", "region"=>["notearth"]}]} 

CONFIG['languages'].map{|l| l['region']}