Попытка понять коллекции chef_vault и ruby

Я новичок в Ruby и Chef. Мне трудно понять, как получить вложенные элементы из пакета данных (chef_vault). Я думаю, что это более фундаментальный вопрос Ruby, но не уверен, что он несколько специфичен для Chef.

Я создал это хранилище:

$json = '{
 "KEY1": [{
  "SUBKEY1": "aaaaa",
  "SUBKEY2": "bbbbbbb",
  "SUBKEY3": "cccccccc"
 }],
 "KEY2": [{
  "SUBKEY1": "dddddd",
  "SUBKEY2": "eeeeee"
 }],
 "KEY3": "fffffff",
 "KEY4": "ggggggg"
}'

knife vault create test_vault vaultitem1 $json --admins red888 --mode client --search 'role:testservers'

Вот что я заметил, пытаясь получить из него вложенные элементы в своем рецепте:

test_vault = ChefVault::Item.load("test_vault", "vaultitem1")

puts test_vault.class
puts test_vault['SUBKEY1'].class
puts test_vault['SUBKEY1'].inspect
puts test_vault['SUBKEY1'][0]['SUBKEY2']

Теперь что я вижу в консоли:

ChefVault::Item
Array
[{"SUBKEY1"=>"aaaaa", "SUBKEY2"=>"bbbbbbb", "SUBKEY3"=>"cccccccc"}]
{"SUBKEY1"=>"aaaaa", "SUBKEY2"=>"bbbbbbb", "SUBKEY3"=>"cccccccc"}
bbbbbbb

Первоначально я попробовал test_vault['KEY1']['SUBKEY2'], что дало мне ошибку. Мой вопрос: почему я должен делать test_vault['KEY1'][0]['SUBKEY2'] что я индексирую с помощью [0]?


person red888    schedule 15.07.2016    source источник


Ответы (1)


KEY1 и KEY2 — это массивы, содержащие один хэш. Вот как вы настроили JSON, так вы должны его использовать. Это не совсем Руби.

person coderanger    schedule 15.07.2016