繁体   English   中英

将对象数组作为参数传递给Rails控制器

[英]Passing array of objects as param to rails controller

我的前端有一系列要传递给Rails控制器的对象。

我要传递给控制器​​的对象数组如下所示:

[ 
  {id: 1, position: 1}, 
  {id: 2, position: 2}
]

在我的控制器中,我正在尝试执行以下操作:

def map
  params[:items].each do |item|
    todo = @user.todos.new(
      item_id: item.id,
      item_position: item.position
    )
    todo.save!
  end
end

我在数组上尝试了JSON.stringify ,然后将其发送到控制器,但是所有内容都是字符串,因此很多方法都无法正常工作。

将对象数组传递到Rails控制器的正确方法是什么?

如果params[:items]是字符串( "[{:id=>1, :position=>1}, {:id=>2, :position=>2}]" )),则可以使用eval() 那将返回一个数组。

在Rails控制台中尝试:

pry(main)> eval("[{:id=>1, :position=>1}, {:id=>2, :position=>2}]")
=> [{:id=>1, :position=>1}, {:id=>2, :position=>2}]

因此,在您的情况下,这应该可以解决问题:

def map
  arr = eval(params[:items])
  arr.each do |item|
    todo = @user.todos.new(
      item_id: item[:id]
    )
    todo.save!
  end
end

希望能帮助到你。

编辑:也许对从外部提交的字符串调用eval并不是最安全的事情(请参见下面的“ mea culpa”评论”)。

因此,我解决了这个问题,唯一能想到的方法是在前端对数组进行编码,然后在控制器中对其进行解码。 如果该值不是哈希数组,它仍然会引发错误,因此您应该在控制器中具有错误处理程序...

在JS中:

let array = [{id: 1, position: 1}, {id: 2, position: 2}]
let yourParamToSendOff = escape(JSON.stringify(array))

在您的后端:

JSON.parse(CGI.unescape("%5B%7B%22id%22%3A1%2C%22position%22%3A1%7D%2C%7B%22id%22%3A2%2C%22position%22%3A2%7D%5D"))
=> [{"id"=>1, "position"=>1}, {"id"=>2, "position"=>2}]

对不起,我的第一个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM