2014-11-06 39 views
0

我有一个Android应用程序,它通过HTTP消息与Rails 4服务器进行通信。JSON元素数组到Rails服务器

我的服务器的数据库中有一个表room_entries有3场

  • 名称:字符串
  • MACADDRESS:字符串
  • 信号:整数

现在我要发送的数据( JSON)从Android应用程序到服务器,但在大多数情况下,我想一次发送多个room_entry

我测试用curl服务器的REST API,它是确定,当我尝试做一个发送HTTP POST消息只是一个room_entry,像这样:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"room_entry": {"name": "room1", "macaddress": "someaddress", "signal": 10}}' http://localhost:3000/room_entries 

的问题是,当我想一次发送多个room_entry,使用数组时,它会在数据库中添加一个空对象(所有字段为NULL)。

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"room_entry": [{"name": "room1", "macaddress": "someaddress1", "signal": 10}, {"name": "room2", "macaddress": "someaddress2", "signal": 40}]}' http://localhost:3000/room_entries 

读其他的问题和答案,我是来的想法,这是我的控制器许可证问题。在如何传递一个特定属性的数组中有很多例子,而不是关于如何发送一个对象本身的数组,所以我有点失落。

+0

我们需要控制的代码,以帮助在这里:/ – iMacTia 2014-11-06 17:23:55

+0

@iMacTia控制器的代码是通用脚本,由脚手架创建。 – 2014-11-06 17:29:08

+0

然后问题在于通用脚手架控制器不能用一次调用管理多个创建。你真的需要这个功能吗(我可以告诉你如何创建一个这样做的方法),或者你只是想知道为什么它不工作?请记住,通常创作一次完成一项。 – iMacTia 2014-11-06 17:39:40

回答

0

如果您想通过一次调用插入多条记录,可以执行以下操作:为此创建一个特定的新方法,或修改现有方法并使其与数组一起作为输入。 这是第二个:)我确定你会喜欢它。所有的 首先,你必须修改的辅助方法,所以采取的一般脚手架实施room_entry_params,并改变它:

def custom_room_entry_params(par = {}) 
    par.permit(:name, :macaddress, :signal) 
end 

def room_entry_params #this is the default one, without parameters 
    custom_room_entry_params(params.require(:room_entry)) 
end 

而在你创建行动:

def create 
    if params[:room_entry].is_a? Array # In case you pass more than one room_entry 
     params[:room_entry].each { |re| RoomEntry.create(custom_room_entry_params(re)) } 
    else 
     RoomEntry.create(room_entry_params) # The default behavior, only one room_entry 
    end 
end 

现在,你应该能够做到既:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"room_entry": {"name": "room1", "macaddress": "someaddress", "signal": 10}}' http://localhost:3000/room_entries 

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"room_entry": [{"name": "room1", "macaddress": "someaddress", "signal": 10}, {"name": "room2", "macaddress": "anotheraddress", "signal": 20}]}' http://localhost:3000/room_entries 

可惜我现在不能测试,因此,如果您遇到任何错误只是让我知道,如果你不能修复它:)

+0

它的工作原理,只需在创建操作中更正'room_entry_parameters'。它应该是'room_entry_params'。谢谢:) – 2014-11-07 13:50:07

+0

感谢您的更正,我编辑了答案:) – iMacTia 2014-11-07 14:28:29