簡體   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