Skip to content

Array of hashes param not being parsed correctly in a spec #1028

Open
@elado

Description

@elado

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions