【问题标题】:Array of JSON elements to Rails server到 Rails 服务器的 JSON 元素数组
【发布时间】:2014-11-07 22:27:32
【问题描述】:

我有一个通过 HTTP 消息与 Rails 4 服务器通信的 Android 应用程序。

我的服务器的数据库有一个表 room_entries 有 3 个字段

  • 名称:字符串
  • mac地址:字符串
  • 信号:int

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

我正在使用 curl 测试服务器的 REST API,当我尝试使用 一个 room_entry 发送 POST HTTP 消息时,它是可以的,如下所示:

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

阅读其他问题和答案后,我认为这是我的控制器中的 permit 问题。关于如何传递特定属性的数组的例子很多,但没有关于如何发送对象本身的数组,所以我有点迷茫。

【问题讨论】:

  • 我们需要控制器的代码来帮助这里:/
  • @iMacTia 控制器的代码是通用的,用脚手架创建的。
  • 那么问题就在于通用的脚手架控制器不能通过一次调用来管理多个创建。你真的需要这个功能(我可以告诉你如何创建一个方法来做到这一点)或者你我们只是想知道为什么它不起作用?请记住,通常一次创建一项。
  • 我需要这样做。我知道它不起作用,因为我的控制器是通用的,但我不知道该怎么做。

标签: android ruby-on-rails json curl


【解决方案1】:

如果您想通过一次调用插入多条记录,您可以同时执行以下操作:为此创建一个特定的新方法或修改现有方法并使其使用数组作为输入。 这是第二个 :) 我相信你会喜欢它。 首先,您必须修改辅助方法,因此采用 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

很遗憾,我现在无法对其进行测试,所以如果您遇到任何错误,请告诉我您是否无法修复它:)

【讨论】:

  • 它有效,只需在创建操作中更正room_entry_parameters。应该是room_entry_params。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多