обход yaml для конфигурации приложения Rails

Я пытаюсь загрузить конфигурацию приложения yaml — дерево стилей, которое я хочу пройти:

style:
    name: Retro
style:
    name: Nouveau
style:
    name: Plain

Я загружаю это, используя следующий инициализатор:

STYLES = YAML.load_file("#{RAILS_ROOT}/config/styles.yml")

Я хочу иметь возможность перемещаться по каждому стилю, используя STYLES[:style].each или аналогичную функцию. Это не удается, и STYLES всегда возвращает только последний из перечисленных. Я действительно не хочу использовать xml (потому что это просто уродливо) ... есть ли способ заставить это работать с yaml?

если нет, буду признателен за любые предложения.


person Paul Nelligan    schedule 25.04.2011    source источник


Ответы (2)


Дерево стилей yaml работает не так, как вы хотите; вам нужно будет реструктурировать его для поддержки нескольких стилей с разными именами.

Retro:
    type: style
Nouvaeu:
    type: style
Plain:
    type: style

Думайте о каждом блоке как о новом объекте. Теперь вы можете получить к ним доступ, используя:

plain_style = YAML.load_file("#{RAILS_ROOT}/config/styles.yml")['Plain']
plain_style['type']    >>> "style"
person Jonathan Julian    schedule 25.04.2011

Это более подробный ответ, чем ответ Джонатана (который в остальном верен).

Формат Yaml больше похож на json, чем на xml. Yaml и json предназначены для простого представления основных, но часто используемых структур данных, общих для большинства языков (и распространенных в языках сценариев). Xml разработан как язык разметки и метаспецификация с множеством функций, облегчающих смешивание различных типов документов.

Самые простые и наиболее часто используемые контейнеры в Yaml — это последовательности и карты. В языках программирования последовательности часто называют списками или массивами, а карты часто называют словарями, хэшами, хэш-картами или массивами (что просто странно; я смотрю на вас, PHP).

Таким образом, ваш документ эквивалентен документу yaml/json (действителен для обоих типов):

{"style": {"name": "Retro"}, "style": {"name": "Nouveau"}, "style": {"name": "Plain"}}

Если вы знаете json или любой другой язык с картами в стиле {}, довольно легко понять, в чем проблема. Написание этого в рубине будет:

{"style" => ..., "style" => ..., "style" => ...}

Последняя пара ключ/значение перезаписывает предыдущую, и до них невозможно добраться. И поэтому вам нужно изменить формат вашего документа.

Предложение 1

Предложение Джонатана Джулиана довольно хорошее:

Retro:
    type: style
Nouvaeu:
    type: style
Plain:
    type: style

Предложение 2

Я бы, вероятно, использовал что-то вроде:

styles:
    Retro:
    Nouvaeu:
    Plain:

Или просто оставьте «стили» вообще, если это подразумевается контекстом.

Предложение 3

Другой пример, больше похожий на xml, — использовать !!pair.

!!pair
- style:
    name: Retro
- style:
    name: Nouveau
- style:
    name: Plain

Это более или менее (в зависимости от парсера/языка) эквивалентно структуре данных:

[("style", {"name": "Retro"}), 
 ("style", {"name": "Nouveau"}), 
 ("style", {"name": "Plain"})]
person driax    schedule 26.07.2011