【问题标题】:Saving an array of hashes from jquery in rails在rails中保存来自jquery的哈希数组
【发布时间】:2012-10-18 19:59:39
【问题描述】:

我是 RoR 的新手。我要解决的问题是如何将哈希数组从 JQuery 传递到 Rails 以保存在数据库中。

上下文

在我的应用程序中,用户可以将任意数量的项目拖放到画布上。这是使用 JQuery 完成的。

然后用户可以保存这些项目,包括它们的 X-Y 坐标。

从概念上讲,我认为这是在保存一个哈希数组,其中每个哈希对应一个项目,由 ItemCode、X 坐标、Y 坐标组成。

我试图弄清楚每一步应该使用什么方法/技术。

这是我目前的发现:

  1. ?在 JQuery 中保存一组对象?
  2. 使用 jquery.param 序列化这个数组
  3. 使用 jquery.ajax 将生成的字符串作为参数传递给 Rails
  4. ?? Rails 控制器以某种方式解析此字符串并将其保存在数据库中??

关键问题

A.这个序列化的字符串应该采用什么格式才能被 Rails 轻松解析?

我相信 Jquery.param 会生成这样的东西(以参数形式): 1[item_code]=432&1[x]=250&1[y]=200&2[item_code]=348... 我找不到任何东西可以告诉我 Rails 是否可以弄清楚前 3 个术语描述了 1 个项目,接下来的 3 描述下一个项目,等等。

B. Rails 的处理方式是什么?换句话说,我应该查看哪些特定方法作为将这个参数字符串作为数据库中的几个新条目放入数据库的工具?

当然,如果有一些完全不同的方法可以做到这一点,我很乐意听到。谢谢。

编辑

澄清一下,ItemCode 与数据库中项目条目的 id 不同。 ItemCode 用于在其他表中查找有关该项目的特征。

【问题讨论】:

  • 我一直在阅读有关 JSON 的更多信息。那会更容易走吗?

标签: ruby-on-rails jquery


【解决方案1】:

一种方式:

decodeURIComponent(jQuery.param({ items: { item1: { x: 1, y: 2 }, item2: { x: 3, y: 4 } } } ))  #  => items[item][x]=1&items[item][y]=2&items[item2][x]=3&items[item2][y]=4

产生一个看起来像

的 params 哈希
{"items"=>{"item"=>{"x"=>"1", "y"=>"2"}, "item2"=>{"x"=>"3", "y"=>"4"}}}

然后在控制器中:

params[:items].each do |k,v|
  begin
    item = Item.new( id: k, x: v.x, y: v.y )  # or better, Item.new( x: v.x, y: v.y ) 
    item.save
  rescue ActiveRecord::RecordInvalid # deal with problems saving
    ...
    # retry?
  end
end

在您的问题中,您正在客户端中生成项目 ID。当您实际创建对象以消除跟踪唯一 ID 的需要时,让数据库处理它是一个更好的主意。在这种情况下,传递给控制器​​的 ID 只是任意占位符,但它们在每个 .param() 调用中必须是唯一的,以区分一个对象。

【讨论】:

  • 我不知道用 2 维 |k,v| 来做每个循环。知道非常有帮助-谢谢。在解码时,我认为 decodeURIComponent 是客户端的 javascript 函数?换句话说,我不需要运行 jQuery.param,先将其传递给 Rails,然后再进行相当于 Rails 解码的操作吗?
  • 那不是二维循环,那是哈希循环。它遍历 Hash 中的每个元素,将每个键、值对传递到块中。 decodeURIComponent() 调用只是为了方便阅读。 .param() 调用将返回一个 URI 编码的字符串,可以安全地通过网络发送,Rails 将对其进行解码。
  • 我最终通过一个带有隐藏字段的表单提交来解决它(因为 rails forms 打包了用于管理登录/注销状态的身份验证令牌),一个与表单一起使用的活动模型(感谢 railscast),以及通过表单提交的数组的 JSON 编码。但是,您的回答让我了解了哈希,这对于这个问题至关重要。谢谢。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2014-05-11
  • 2012-05-30
  • 1970-01-01
  • 2012-04-10
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多