2012-10-18 35 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