2011-08-29 108 views
4

我有一個巨大的配置yaml文件,其中所有節點都應該作爲字符串讀取。舉個例子:如何強制yaml中的所有節點都是字符串

model_names: 
    Audi: 
    A4: 
     - A4 
     - A 4 
    Fiat: 
    500: 
     - 500 

我加載了文件中的軌道:

catalogue = File.read("#{Rails.root}/config/cars_catalogue.yml") 
CARS_CATALOGUE = YAML.load(catalogue) 

我的問題是,如果我問:

CARS_CATALOGUE['model_names']['Fiat']['500'] 

它返回nil,因爲它認爲, 500:是一個fixnum - 但所有的節點總是應該是字符串 - 我不想在yaml文件中的任何地方用引號強制執行此操作。那麼我該如何以簡單明智的方式來做到這一點?

回答

2

stringify_keys都應該鍵轉換爲字符串

catalogue = File.read("#{Rails.root}/config/cars_catalogue.yml") 
CARS_CATALOGUE = YAML.load(catalogue).stringify_keys 

最好還是使用YAML.load(catalogue).symbolize_keys所有鍵轉換爲符號

+3

但它只適用於散列的直接鍵,不會遞歸嵌套散列。 – rubish

+1

OP已經用'ruby-on-rails'標記了這個問題,所以這裏適合這個法案,但是這個解決方案在純ruby環境下不起作用('stringify_keys'在'ActiveSupport'中)。只是想我會提到它。 –

+0

是的 - 你是對的所有三個人 - stringify_keys的東西,正如前面提到的那樣,它只適用於第一級的鍵 - 不是嵌套的而不是數組...所以有辦法在所有節點? –

5

您可以重新生成文件?如果是,那麼只需在數字中加上引號:

model_names: 
    Audi: 
    A4: 
     - A4 
     - A 4 
    Fiat: 
    "500": 
     - 500 

這應該這樣做。

+1

聽起來像你沒有讀過這個問題,他特別說:'我不想在yaml文件中的任何地方用引號強制執行此操作。 –

1

Rails目前有一個遞歸鍵字符串函數; check it

+0

僅限Rails 4 – prusswan

+0

@prusswan這就是爲什麼我使用*當前*這個詞。 Rails現在是第4版。另外,請注意我的鏈接,該鏈接始終可以被複制和使用。 –

相關問題