В сообщении об ошибке говорится, что вы передавали String
, где Ruby ожидает что-то, что неявно преобразуется в Integer
. Место номер один, где Ruby ожидает что-то, что неявно преобразуется в Integer
, - это индексирование в Array
. Таким образом, всякий раз, когда вы видите это сообщение об ошибке, вы можете быть на 99% уверены, что вы либо индексируете Array
с чем-то, что вы считаете Integer
, но это не так, или что вы индексируете Array
, что вы думали было что-то еще (скорее всего, Hash
). (Другая возможность состоит в том, что вы пытаетесь сделать арифметику со смесью Integers
и Strings
.)
То, что Ruby является динамически типизированным языком программирования, не означает, что вам не нужно заботиться о типах. В частности, YAML является (несколько) типизированным форматом сериализации.
Тип создаваемого вами файла выглядит примерно так:
Map<String, Sequence<Map<String, Sequence<Int | null>>>>
Однако вы получаете к нему доступ, как если бы он был напечатан так:
Map<String, Map<String, Sequence<Int | null>>>
Если говорить более конкретно, вы создаете значение, соответствующее ключу 'reminders'
как последовательность (в терминах YAML, Array
в рубиновых выражениях) из карты (Hash
es). Array
индексируются Integers
.
Однако вы индексируете его с помощью String
, как если бы это было Hash
.
Итак, вам либо нужно изменить способ доступа к значениям следующим образом:
yml['reminders'][0]['reminder_a'] = [123, 456]
# ↑↑↑
yml['reminders'][1]['reminder_b'] = [457,635,123]
# ↑↑↑
Или измените способ инициализации файла следующим образом:
File.write(db_yml, Psych.dump(
{ 'reminders' => {
# ↑
'reminder_a' => [nil],
# ↑ ↑
'reminder_b' => [nil]
# ↑ ↑
}
чтобы итоговый документ YAML выглядел следующим образом:
---
reminders:
reminder_a:
-
reminder_b:
-