【问题标题】:Rails:Receive POST with JSON arrayRails:使用 JSON 数组接收 POST
【发布时间】:2016-06-11 15:49:46
【问题描述】:

我目前正在使用控制器一次接收带有一个 json 对象的 POST。我希望它改为接收整个数组。如何修改我的控制器?

当前控制器

def create
  respond_to do |format|

  @targetrecord = TargetRecord.new(targetrecord_params)
  @targetrecord.save

    if @targetrecord.save
      format.json{ render :json => @targetrecord.to_json ,status: 200 }
    else
      format.json { render json: @targetrecord.errors, status: 404 }
    end

  end
 end
end

def targetrecord_params

  params.require(:targetrecord).permit(:id, :uuid, :manor, :mac, :beacon_type, :longitude, :latitude, :address, :findTime, :rssi, :finderID, :created_at, :updated_at )

end

我现在正在发送如下的 POST

"targetrecord":

{"id":"","name":"",.....}

我想将多个集合作为一个数组发送,例如

"targetrecord":[

{"id":"1","name":"",.....},
{"id":"2","name":"",.....},
....]

如何让我的控制器知道她需要一一提取和创建?非常感谢!

【问题讨论】:

  • 如果创建失败,你希望它表现如何?
  • 只是简单地显示错误或什么都不做都可以!服务器将完成发布工作!

标签: ruby-on-rails arrays json post


【解决方案1】:

如果您要发布一个数组,那么当控制器操作处理该数组时,该数组将只是您的 params 对象的一部分。因此,您应该能够遍历数组并创建一个 TargetRecord 对象数组。您需要修改 targetrecord_params 方法以允许它接受参数,因为一旦进行更改,您就不能只查看该上下文中的“参数”。您还需要找到一种方法来跟踪是否所有记录都已成功保存。

我还没有测试过这段代码,但我认为这样的事情应该会让你朝着正确的方向前进:

    def create
        respond_to do |format|

        @targetrecords = []
        save_succeeded = true
        params[:targetrecord].each do |record|
            tr = TargetRecord.new(targetrecord_params(record))
            save_succeeded = false unless tr.save
            targetrecords << tr
        end

            if save_succeeded
                format.json{ render :json => @targetrecord.to_json ,status: 200 }
            else
                format.json { render json: @targetrecord.errors, status: 404 }
            end

        end
     end
    end

    def targetrecord_params(record)
        record.require(:targetrecord).permit(:id, :uuid, :manor, :mac, :beacon_type, :longitude, :latitude, :address, :findTime, :rssi, :finderID, :created_at, :updated_at )
    end

【讨论】:

  • 谢谢!但我有几个问题。 @targetrecords = [] 在这里是什么意思?为什么我们需要宣布它? “targetrecords
  • 您在只处理一个 TargetRecord 之前所做的事情,但您需要处理它们的集合,对吗?因此,在这种情况下,我将创建一个包含 TargetRecord 对象数组的实例变量。这样你就可以处理你的对象集合,而不仅仅是一个。所以@targetrecords = [] 将实例变量声明为一个数组,&lt;&lt; 将每个 TargetRecord 对象添加到数组中,因为您循环遍历参数中的数组并将每个参数项转换为 Ruby 对象。
  • 我试过了,但出了点问题。它说“参数丢失或值为空:targetrecord”,它停在record.require(:targetrecord).permit(:id,....
  • 正确 - 正如我上面提到的,这不是经过测试的代码。我不知道您在发布什么参数,所以我不知道如何构建一个确切的示例。您需要对其进行定制以匹配您的控制器操作接收的任何参数。要对此进行调试,请在代码失败的地方检查您的参数。您可以使用 pry 或 byebug 之类的调试器,或者使用 puts 并在代码失败的地方查看您的参数来做到这一点。
  • 例如,当您的代码命中 targetrecord_params 方法时,您需要检查“记录”值是什么并相应地修改允许的属性。可能您只有一个包含 id、uuid、manor 等的数组值。在这种情况下,您将省略 require(:targetrecord) 语句,因为您不希望有一个名为“targetrecord”的参数!请记住,您的 targetrecord_params 的目的只是将预期的模型属性列入白名单。
猜你喜欢
  • 2018-10-31
  • 2018-09-17
相关资源
最近更新 更多