如何正确发送一个JSON请求测试Rails?

How to send correctly a JSON request testing Rails?

我在 Rails 中看到一个奇怪的行为,当发送 post 请求时,正文如下:

如果你检查的是一个Hash(发送时转换为JSON)。但是奇怪的是,当控制器中的参数读取时,被识别为:

如果仔细检查,:first_name:email的属性被移动到数组中的前一项。

我想如果你有一个在第一个项目上有某些属性的数组,但在后面的项目上有一些不同的属性,那么这个数组将尊重属性设置的位置。

我知道答案很可能是 "just put a nil or empty value of those attributes on the first item of the array",但我更感兴趣的是为什么会这样。

谢谢。

更新

感谢一个问题,我从浏览器复制了场景(我最初是从 rails 的 test 功能请求),并从浏览器检查网络,这是发送的内容:

{
  "name": "un nombre",
  "team_members": [
    {
      "user_id": 1,
      "team_member_role_id": 4
    },
    {
      "email": "cpamerica@avengers.com",
      "first_name": "Cap America",
      "team_member_role_id": 4,
      "admin": true
    },
    {
      "email": "hulk@avenrgers.com",
      "first_name": "Bruce Banner",
      "team_member_role_id": 1,
      "admin": false
    },
    {
      "email": "ironman@avengers.com",
      "first_name": "Tony Stark",
      "team_member_role_id": 1,
      "admin": false
    },
    {
      "email": "thor@avengers.com",
      "first_name": "Thor Hijo de Odín",
      "team_member_role_id": 2,
      "admin": false
    }
  ]
}

并且有效。所以我专注于如何从测试环境发送信息,这是实际代码:

team        = {
    :name         => 'un nombre',
    :team_members => [
        {
            :user_id             => 1,
            :team_member_role_id => TeamMemberRole.role_communicator_id
        },
        {
            :email               => 'cpamerica@avengers.com',
            :first_name          => 'Cap America',
            :team_member_role_id => TeamMemberRole.role_communicator_id,
            :admin               => true
        },
        {
            :email               => 'hulk@avenrgers.com',
            :first_name          => 'Bruce Banner',
            :team_member_role_id => TeamMemberRole.role_visionary_id,
            :admin               => false
        },
        {
            :email               => 'ironman@avengers.com',
            :first_name          => 'Tony Stark',
            :team_member_role_id => TeamMemberRole.role_visionary_id,
            :admin               => false
        },
        {
            :email               => 'thor@avengers.com',
            :first_name          => 'Thor Hijo de Odín',
            :team_member_role_id => TeamMemberRole.role_developer_id,
            :admin               => false
        }
    ]
}
post create_team_path, :team => team, :format => :json

request.raw 在控制器中读取的是什么(使用调试器):

team[name]=un+nombre&
team[team_members][][user_id]=1&
team[team_members][][team_member_role_id]=4&
team[team_members][][email]=cpamerica%40avengers.com&
team[team_members][][first_name]=Cap+America&
team[team_members][][team_member_role_id]=4&
team[team_members][][admin]=true&
team[team_members][][email]=hulk%40avenrgers.com&
team[team_members][][first_name]=Bruce+Banner&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=ironman%40avengers.com&
team[team_members][][first_name]=Tony+Stark&
team[team_members][][team_member_role_id]=1&
team[team_members][][admin]=false&
team[team_members][][email]=thor%40avengers.com&
team[team_members][][first_name]=Thor+Hijo+de+Od%C3%ADn&
team[team_members][][team_member_role_id]=2&
team[team_members][][admin]=false&
format=json

知道为什么缺少每个 team_member 的索引吗?我发送的数组有误吗?

要发送可接受的 json 请求,您需要以形成的字符串形式发送而不是散列,同时添加 headers 您的代码必须如下所示:

post create_team_path, {:team => team}.to_json, 'CONTENT_TYPE' => 'application/json;charset=utf-8'

请注意,问题出在 form-request 的解析器哈希中,没有添加每个 object

的索引

来源:How to post JSON data in rails 3 functional test