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

时间:2019-01-17 22:16:45

标签: javascript ruby-on-rails

我的前端有一系列要传递给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控制器的正确方法是什么?

1 个答案:

答案 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}]

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