修改ruby / sinatra POST以接收JSON数组条目

时间:2014-07-21 23:32:03

标签: ruby json sinatra

我的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

1 个答案:

答案 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"])