[英]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.