1

在我的 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 中都表现出这种行为。

为什么 rack/test 将 3 个哈希合并为 1,而不是完全按照定义发送数组?是否有一个设置会导致 rack 表现出我预期的行为?

4

1 回答 1

0

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

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 个单独的哈希。但是,插入占位符键很不方便,因此不需要。此外,无法测试控制器基于此类密钥的存在而采取不同行动的场景(尽管不常见)。

于 2013-04-15T00:29:32.407 回答