2011-08-29 8 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'] 

그것은 전무를 반환, 그것은 생각하기 때문에 500 : fixnum입니다.하지만 모든 노드는 항상 문자열이어야합니다. yaml 파일의 모든 곳에서 따옴표를 사용하여이를 적용하고 싶지는 않습니다. 그렇다면 어떻게 간단하고 똑똑한 방식으로이 작업을 수행 할 수 있습니까?

답변

2

stringify_keys 당신이 파일을 다시 생성 할 수 문자

+3

그러나 해시 즉시 키에서만 작동하며 중첩 해시로 재귀하지 않습니다. – rubish

+1

OP는 'ruby-on-rails'태그로 태그를 달았으므로이 방법은 여기에 적합하지만이 솔루션은 순수한 루비 환경에서는 작동하지 않습니다 ('stringify_keys'는'ActiveSupport'에 있습니다). 그냥 내가 언급 한 줄 알았는데. –

+0

예 - 여러분 모두 3 명입니다 - stringify_keys를 사용하는 것은 앞에서 언급했듯이 키의 첫 번째 레벨에서만 작동합니다 - 중첩되지 않고 배열이 아닌 것입니다 ... 그래서 모든 작업을 수행 할 수있는 방법이 있습니다 노드? –

5

에 모든 키를 변환하는 YAML.load(catalogue).symbolize_keys를 사용하는 문자열 여전히

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

더 나은 모든 키를 변환해야합니까? 그렇다면 숫자에 따옴표를 추가하십시오.

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

그렇게해야합니다.

+1

질문을 읽지 않은 것처럼 들리 겠지만, 구체적으로 말하길 : "나는 yaml 파일의 모든 곳에서 따옴표로 이것을 시행하고 싶지 않습니다." –

1

현재 Rails에는 재귀 적 키 문자열 기능이 있습니다. check it

+0

레일 4에서만 사용 가능 – prusswan

+0

@prusswan 그래서 저는 * currently *라는 단어를 사용합니다. Rails는 현재 버전 4입니다. 또한 항상 복사하여 사용할 수있는 함수 소스에 대한 링크를 확인하십시오. –

관련 문제