обходить yaml для конфигурации приложения Rails - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь загрузить конфигурацию приложения 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?

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

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Дерево стилей 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"
0 голосов
/ 26 июля 2011

Это более глубокий ответ, чем у Джонатана (что в противном случае верно).

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

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

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

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

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

{"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"})]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...