【问题标题】:Why rack/test is combining hashes into one when performing POST or PUT operations为什么 rack/test 在执行 POST 或 PUT 操作时将哈希合二为一
【发布时间】:2023-03-21 15:28:01
【问题描述】:

在我的 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}]}}

机架/测试在 PUT 操作和 POST 中都表现出这种行为。

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

【问题讨论】:

    标签: ruby-on-rails-3 rspec rack


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2015-04-29
      • 2012-05-23
      • 2012-02-26
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多