我的前端有一系列要传递给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控制器的正确方法是什么?
答案 0 :(得分:2)
如果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
也许不是最安全的事情(请参见下面的“我的观点”)。
所以我解决了这个问题,我想出的唯一方法是在前端对数组进行编码,然后在控制器中对其进行解码。如果该值不是哈希数组,它仍然会引发错误,因此您应该在控制器中具有错误处理程序...
在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}]
对不起,我的第一个答案。...