【问题标题】:Passing array of objects as param to rails controller将对象数组作为参数传递给rails控制器
【发布时间】:2019-06-12 04:36:28
【问题描述】:

我的前端有一组对象,我想将它们传递给我的 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 控制器的正确方法是什么?

【问题讨论】:

  • 当然你会收到一个字符串,这就是 JSON.stringify 所做的。您是否尝试在控制器中“取消字符串化”?另外:stackoverflow.com/questions/38175383/…
  • 在我在 Rails 中 JSON.parse 后,我收到错误 undefined method 'id' for {:id=>1}:Hash

标签: javascript ruby-on-rails


【解决方案1】:

如果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}]

对不起我的第一个回答......

【讨论】:

  • 我收到一个错误:undefined method 'id' for {:id=>1}:Hash
  • 我修改了我的答案。你使用了item.id。应该是item[:id]。抱歉,我第一眼没发现。
  • 你是在提议某人eval一个来自外部世界的字符串?
  • @muistooshort 你建议用什么替代eval
  • 如果客户端在 JavaScript 中使用 JSON.stringify,Ruby 端总是有 JSON.parse。纠正自己始终是拒绝投票和删除答案的一种可接受的替代方法(就像您在我撰写此评论时所做的那样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2012-01-25
  • 2016-02-09
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多