Ответ 1
Я подозреваю, что это связано с различиями в том, как они конвертируют хэш в параметры. Rack:: Test, вероятно, будет использовать Hash # to_param, который дает следующие результаты:
> params = {:api_key => "12345", :data => [{"Company"=>"Apple,Inc","Website"=>"Apple.com"},{"Company"=>"Google","Website"=>"google.com"}], :run => { :title => "The First Run" }}
> paramstring = params.to_param
=> "api_key=12345&data%5B%5D%5BCompany%5D=Apple%2CInc&data%5B%5D%5BWebsite%5D=Apple.com&data%5B%5D%5BCompany%5D=Google&data%5B%5D%5BWebsite%5D=google.com&run%5Btitle%5D=The+First+Run"
> URI.unescape(paramstring)
=> "api_key=12345&data[][Company]=Apple,Inc&data[][Website]=Apple.com&data[][Company]=Google&data[][Website]=google.com&run[title]=The+First+Run"
Это сложная часть:
данные [] [Компания] = Яблоко, Inc & данные [] [Сайт] = Apple.com & данные [] [Компания] = Google & данные [] [Сайт] = google.com
Анализатор uri rails должен прочитать это и включить его в хэш. На мой взгляд, набор массивов хэшей в ваши параметры задает проблемы, поскольку он создает строку, как и выше, что в корне трудно анализировать. Например, представленные этими двумя параметрами
data[][Company]=Apple,Inc
data[][Company]=Google
Парсер может решить, что оба из них описывают переменную Company в первом хэше в массиве, называемом "data", и поэтому сначала перезаписывают вторую, что и происходит с вами.
Похоже, ваша проблема на стадии покоя, а не на этапе интпретации, но все же я попытаюсь создать более чистую схему для ваших параметров, в которой массивы используются только как конечная часть имени параметра, (т.е. использовать хеш вместо массива для хранения данных компании), и вместо этого вы вставляете некоторые уникальные ключи, чтобы отличать хэши компании друг от друга. Что-то вроде этого:
{:api_key => "12345",
:data => {1 => {"Company"=>"Apple,Inc","Website"=>"Apple.com"}, 2 => {"Company"=>"Google","Website"=>"google.com"}},
:run => { :title => "The First Run" }}
1 и 2 могут быть фактическими идентификаторами какой-либо записи компании, или просто могут быть некоторые номера, которые вы вводите, чтобы создавать уникальные ключи, которые отбрасываются на другом конце. Это создаст такие параметры:
data[1][Company]=Apple,Inc
data[2][Company]=Google
Теперь нет опасности переписывать друг друга.
В вашем последующем действии контроллера это просто изменение от этого:
params[:data].each do |company_hash|
#do something with company hash
end
to
params[:data].each do |k, company_hash|
#do something with company hash and optionally k if you want, or ignore k
end