Ваша проблема вызвана различными приоритетами при предоставлении блоков для вызовов методов. В вашем случае вы используете следующий код:
qs.concat value.map do |val|
"#{field}=#{val}"
end
Ruby предполагает, что вы имеете в виду следующее:
qs.concat(value.map) do |val|
"#{field}=#{val}"
end
То есть Ruby передает блок первому методу (т.е. qs.concat
), который игнорирует блок. Поскольку Array#map
возвращает Enumerator
, если вы не пропустили блок, вы получите ошибку, которую видели.
Чтобы решить эту проблему, вы можете использовать форму фигурных скобок для прохождения блока, т. Е .:
qs.concat value.map { |val|
"#{field}=#{val}"
}
В этой форме блок всегда передается «последнему» методу, т.е. ваш map
.
В любом случае, если есть какие-либо сомнения относительно приоритета оператора, всегда полезно использовать явные скобки или промежуточные переменные, чтобы прояснить как читателям, так и интерпретатору Ruby, как должен работать ваш код .