Ruby on rails Rails:使用JSON数组接收POST

Ruby on rails Rails:使用JSON数组接收POST,ruby-on-rails,arrays,json,post,Ruby On Rails,Arrays,Json,Post,我目前正在使用一个控制器一次接收一个json对象的POST。我想让它变成接收整个阵列。如何修改控制器 当前控制器 def create respond_to do |format| @targetrecord = TargetRecord.new(targetrecord_params) @targetrecord.save if @targetrecord.save format.json{ render :json => @targetrecord.

我目前正在使用一个控制器一次接收一个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
我现在发送的邮件如下

"targetrecord":

{"id":"","name":"",.....}
我想以数组的形式发送多个集合,就像

"targetrecord":[

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

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

如果您正在发布一个数组,那么当控制器操作处理该数组时,该数组将只是params对象的一部分。因此,您应该能够在数组中循环并创建TargetRecord对象数组。您需要修改targetrecord_params方法以允许它接受参数,因为您不能在进行更改后仅查看该上下文中的“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
def创建
回应待办事项|格式|
@targetrecords=[]
保存成功=真
参数[:targetrecord]。每个do |记录|
tr=TargetRecord.new(TargetRecord_参数(记录))
除非tr.save,否则save\u successed=false
targetrecords@targetrecord.to_json,状态:200}
其他的
format.json{render json:@targetrecord.errors,状态:404}
结束
结束
结束
结束
def targetrecord_参数(记录)
记录。要求(:targetrecord)。允许(:id,:uuid,:manor,:mac,:信标类型,:经度,:纬度,:地址,:findTime,:rssi,:finderID,:创建地点,:更新地点)
结束

如果创建失败,您希望它如何运行?只需显示错误或什么都不做都可以!服务器将完成发布工作!谢谢但我有几个问题。@targetrecords=[]在这里是什么意思?我们为什么要宣布呢?“您之前只处理了一个TargetRecord,但您需要处理它们的集合,对吗?因此,在本例中,我创建了一个包含TargetRecord对象数组的实例变量。这样您就可以处理对象集合,而不仅仅是一个。因此
@targetrecords=[]
将实例变量声明为数组,并且
我尝试了它,但出现了一些错误。它表示“缺少参数或值为空:targetrecord”,并在
记录处停止。require(:targetrecord)。允许(:id,.
对-正如我上面提到的,这不是经过测试的代码。我不知道您发布的参数是什么,所以我不知道如何构建一个确切的示例。您需要对其进行调整,以匹配控制器操作接收的任何参数。若要调试此代码,请在该点检查您的参数代码失败的地方。您可以通过使用pry或byebug之类的调试器,或者通过使用puts并在代码失败的地方查看参数来做到这一点。例如,当代码命中targetrecord_params方法时,您需要检查“record”值是什么,并相应地修改允许的属性。可能是您只需要一个id、uuid、manor等的数组值。在这种情况下,您将省略
require(:targetrecord)
语句,因为您不需要名为“targetrecord”的参数!请记住,targetrecord\u参数的目的只是将期望的模型属性列入白名单。