【发布时间】:2016-06-03 16:28:31
【问题描述】:
我在 Rails 中看到一个奇怪的行为,在发送一个 post 请求时,有以下正文:
如果您检查的是哈希(发送时转换为 JSON)。但是奇怪的是,当控制器中的参数读取时,会这样识别:
如果仔细检查,:first_name 和 :email 的属性会移动到数组中的上一项。
我想如果你有一个数组,在第一个项目上具有某些属性,但在以下项目上有一些不同的属性,那么该数组将尊重设置属性的位置。
我知道答案很可能是“只需将这些属性的nil 或空值放在数组的第一项上”,但我更感兴趣的是为什么会这样。
谢谢。
更新
感谢一个问题,我从浏览器中复制了场景(我最初是从 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 的索引丢失了吗?我发送的数组有误吗?
【问题讨论】:
-
您是否检查过网络上实际发送的内容(例如,使用 chrome 的网络检查器)?
-
@FrederickCheung 我正在使用 Rails 的测试框架而不是浏览器发出请求。所以我写了
post create_team_path, { :format => :json, :team => team }其中team是哈希。 -
@FrederickCheung 更新问题的新方法
-
看起来测试框架的 post 方法正在序列化请求参数,就好像它是正常的非 JSON 数据一样,并且在以某些方式组合数组和散列时确实有限制。不知道你如何让它做一个实际的 JSON 帖子
标签: ruby-on-rails arrays api post params