Когда вы делаете
inplaies = response.fetch('results',[]).map { |odd| Odd.new(odd) }
Вы говорите, дайте мне все "результаты" ответа, которые
{
"1_1": [{}],
"1_2": [{}],
}
Пока все хорошо. Затем вы вызываете .map по этому вопросу. Когда вы вызываете .map, он преобразует каждый элемент этого хэша в массив из 2 элементов, причем первый элемент является ключом, а второй элемент - значением. Итак, ваши переменные 'нечетные' теперь выглядят так:
["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]
["1_2", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]
["1_3", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]
Затем вы передаете каждый из этих элементов массива в Odd.new, так что вы фактически делаете:
Odd.new(["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]])
Как я уже упоминал в своем комментарии, ваш нечетный инициализатор ожидает хеш, но вы вместо этого предоставляете этот массив.
Наконец-то звонит
parse_1x2(args)
Что с вашими аргументами, является
parse_1x2(["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]])
Но этот метод ожидает хеш.
Когда вы вызываете .fetch для Array, он ожидает, что вы предоставите числовой индекс. Но вы вызываете .fetch с «1_1», который является строкой, потому что вы ожидаете, что «args» будет хешем прямо здесь.
Вы можете увидеть это в действии, запустив консоль Rails и выполнив:
[1,2,3].fetch(0) # will work
[1,2,3].fetch("some string key") # will fail with the same error you're getting
То, что вы хотите сделать здесь, чтобы начать с нуля, - это снова преобразовать ваш 2-элементный массив в хеш:
Изменение
inplaies = response.fetch('results',[]).map { |odd| Odd.new(odd) }
К
inplaies = response.fetch('results',[]).map { |odd| Odd.new([odd].to_h) }
При этом вы преобразуете свой 2-элементный массив обратно в Hash, чего вы и ожидаете позже в коде.