Open
Description
It might be a Rack issue, but:
before do
subject.params do
requires :contacts, type: Array do
optional :name
optional :phone
optional :email
end
end
subject.before_validation do
pp form_vars: env['rack.request.form_vars'], form_hash: env['rack.request.form_hash']
pp before: params.to_h
end
subject.post '/post' do
end
end
it 'posts an array of hashes' do
post '/post', contacts: [
{ name: 'John', phone: '123' },
{ email: 'a@mail.com' },
{ name: 'Doe', email: 'b@mail.com' },
]
end
Output is:
{:form_vars=>
"contacts[][name]=John&contacts[][phone]=123&contacts[][email]=a%40mail.com&contacts[][name]=Doe&contacts[][email]=b%40mail.com",
:form_hash=>
{"contacts"=>
[{"name"=>"John", "phone"=>"123", "email"=>"a@mail.com"},
{"name"=>"Doe", "email"=>"b@mail.com"}]}}
{:before=>
{"contacts"=>
[{"name"=>"John", "phone"=>"123", "email"=>"a@mail.com"},
{"name"=>"Doe", "email"=>"b@mail.com"}]}}
Rack(?) couldn't infer where each element starts so it combined both first items.
For a workaround I can send a Hash {0=>{name: ..., email:}, 1=>{email: ...}}
and before validation do:
params[:contacts] = params[:contacts].values if params[:contacts].is_a?(Hash)
Any other suggestions?