我的sinatra代码目前一次接受一个POST,但我希望能够发布一系列条目。修改此代码以允许在单个POST请求中发布多个条目的最佳方法是什么?
post '/api/events' do
body = JSON.parse request.body.read
event = Event.create(
event_type: body['event_type'],
event_subtype: body['event_subtype'],
note: body['note'],
user_email: body['user_email'],
user_system: body['user_system'],
user_software: body['user_software']
)
status 201
format_response(event, request.accept)
end
答案 0 :(得分:2)
来自客户端的JSON必须正确构造,以便服务器可以将其解析为事件数组,即服务器将接收查询字符串,例如:
如果mime-type为application/x-www-form-urlencoded
:
?events[][event_type]=Good&events[][note]=neato
由于括号events[]
,每个成员将位于以下括号[event_type]
中,因此该查询字符串将被解析为事件数组。换句话说(代码):
root_key[sub_key]=value => { root_key: { sub_key: value } }
root_key[][sub_key]=value => { root_key: [{ sub_key: value }] }
如果mime类型为application/json
并且您正在使用ajax库(如jQuery),则可以指定dataType: 'json'
并在数据选项中为其指定一个对象,例如:
data: { events: [{ events_type: 'Good', ...}, ...] }
例如:
$.ajax({
dataType: 'json',
data: { events: [{ events_type: "Good", note: "neato" }] }
});
查询字符串或json将被解析为:
body = JSON.parse request.body.read
body # => [{ event_type: "Good", note: "neato" }]
使用ActiveRecord,您可以将该数组直接传递给Event.create(body["events"])
。