为什么机架/测试在执行POST或PUT操作时将哈希组合成一个



在我的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服务器接收"invitations_attributes"作为哈希数组。但是,developer.log文件包含以下内容:

Parameters: {"auth_token"=>"RSySKfN2L8b5QPqnfGf7", "event"=>{"invitations_attributes"=>
[{"recipient_id"=>"40", "email"=>"a@a.com", "facebook_id"=>"123456789"}]}}

(在上面的参数中,"invitation_attributes"数组只包含1个哈希值)

下面的curl语句:

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}]}}

Rack/test对PUT操作和POST操作都显示了这种行为。

为什么机架/测试将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个单独的散列。然而,插入占位符键是不方便的,不应该是必需的。此外,无法测试基于存在键的控制器的不同行为的场景(尽管不常见)。

最新更新