Ruby on rails 3 为什么在执行POST或PUT操作时,rack/test将哈希合并为一个

Ruby on rails 3 为什么在执行POST或PUT操作时,rack/test将哈希合并为一个,ruby-on-rails-3,rspec,rack,Ruby On Rails 3,Rspec,Rack,在我的rspec测试中,我定义了以下哈希数组并执行了POST: body = {:event => { :invitations_attributes => [ {:recipient_id => 40}, {:email => 'a@a.com'}, {:facebook_id => 123456789} ] } } post "#{@url}.json", body.reverse_merge(:auth_token => @token) 基于上述

在我的rspec测试中,我定义了以下哈希数组并执行了POST:

body = {:event => { :invitations_attributes => 
  [ {:recipient_id => 40}, {:email => 'a@a.com'}, {:facebook_id => 123456789} ] } }
post "#{@url}.json", body.reverse_merge(:auth_token => @token)
基于上述内容,我希望Rails服务器能够以哈希数组的形式接收属性。但是,developer.log文件具有以下内容:

Parameters: {"auth_token"=>"RSySKfN2L8b5QPqnfGf7", "event"=>{"invitations_attributes"=>
[{"recipient_id"=>"40", "email"=>"a@a.com", "facebook_id"=>"123456789"}]}}
在上述参数中,属性数组仅包含1个哈希

下面是一句话:

curl -X POST -H "Content-type: application/json" http://localhost:3000/api/v1/events.json -d '{"auth_token":"RSySKfN2L8b5QPqnfGf7","event":{"invitation_attributes":[{"recipient_id":40},{"email":"a@a.com"},{"facebook_id":123456789}]}}'
导致Rails完整地接收哈希数组,下面的日志文件条目就证明了这一点

Parameters: {"auth_token"=>"RSySKfN2L8b5QPqnfGf7", "event"=>{"invitation_attributes"=>
[{"recipient_id"=>40}, {"email"=>"a@a.com"}, {"facebook_id"=>123456789}]}}
机架/测试显示了PUT操作和POST的这种行为


为什么rack/test将3个散列合并为1,而不是按照定义的方式发送阵列?是否有一种设置会导致rack显示出我所期望的行为?

一种解决方法是通过插入零值占位符键来确保每个哈希包含每个键,如下所示:

body = {:event => { :invitations_attributes => [
  {:recipient_id => 40, :recipient_email => nil, :recipient_facebook_id => nil},
  {:recipient_email => user.email, :recipient_id => nil, :recipient_facebook_id => nil}, 
  {:recipient_facebook_id => new_unused_facebook_id, :recipient_email => nil, :recipient_id => nil}  ] } }
上面的散列确实会导致服务器在数组中接收3个单独的散列。但是,插入占位符键很不方便,不应该是必需的。此外,无法测试控制器基于存在此类密钥(尽管不常见)而采取不同行动的场景