2012-10-18 36 views
2

我是RoR的新手。我试图解决的问题是如何将一组哈希从JQuery传递到Rails以保存在数据库中。在rails中保存jquery的散列数组

语境

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

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

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

我想弄明白在每一步,应该使用什么方法/技术。

这里是我想通了,至今:

  1. ?在JQuery中保存一个对象数组?
  2. 序列化此阵列使用jquery.param
  3. 传递所得到的字符串作为PARAMS到Rails使用jquery.ajax
  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的处理方式这个?换句话说,作为将这个params字符串放入数据库的工具,应该将哪些特定的方法看作是数据库中的多个新条目?

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

编辑

只是为了澄清,该ItemCode意味着是从项目进入数据库的ID不同。 ItemCode用于查找其他表中项目的特征。

+0

我一直在阅读更多关于JSON。这是一个更容易的路线吗? – bigwinner

回答

0

方式一:

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只是任意占位符,但它们必须在每个调用中都是唯一的,以区分一个对象与另一个对象。

+0

我不知道做每个循环有2维| k,v |。非常有帮助知道 - 谢谢。在解码上,我认为decodeURIComponent是客户端的JavaScript函数?换句话说,我不需要运行jQuery.param,先将它传递给Rails,然后做相当于Rails解码的代码? – bigwinner

+0

这不是一个2D循环,这是一个哈希循环。它遍历Hash中的每个元素,将每个键值对传递给块。 decodeURIComponent()调用只是为了方便阅读。 '.param()'调用将返回一个URI编码的字符串,可以安全地通过线路发送,并且Rails将对其进行解码。 – jordanpg

+0

我最终通过一个带有隐藏字段的表单提交来解决它(因为rails为了管理登录/注销状态而封装了auth令牌),一个与表单一起使用的activemodel(感谢railscast)以及JSON编码通过表单提交。然而你的回答让我明白了哈希,这对于这个问题是很重要的。谢谢。 – bigwinner