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