2011-04-28 55 views
1

問題on Rails的3.0.7和jQuery 1.5.1如何更新Rails 3中AJAX提交的隱藏表單域?

概述

我嘗試做以下的事情。我有一個網頁,其中一面有一個表格,可以讓我創建一個類別,另一面有一個項目列表,每個項目都有一個複選框。我希望能夠檢查每個項目的複選框,以便當我提交表單以創建類別時,新創建的類別還通過與每個項目的關聯創建has_many。

因此,關聯部分幾乎工作,我可以提交一個選中的複選框列表,如果我發送選中的項目列表,Rails會在後端創建關聯。

問題:

這裏是行不通:

我試圖通過Ajax提交表單,所以我想將事件句柄綁定到rails.js「AJAX:beforeSend '事件,以便它將掃描我選中的複選框列表並將檢查到的ID轉換爲隱藏的表單字段。

問題是:我嘗試獲取所有選中框的列表,並在用戶單擊Submit按鈕時將它們添加到隱藏字段中。因此,我想我會把代碼放在ajax:beforeSend事件處理程序中。我注意到的是,我注意到的是,rails.js已經處理了表單字段,並且在處理器觸發之前構造了HTTP查詢。我通過以下行爲注意到這一點:

觀測到的行爲

1)我可以重新加載一個新的頁面,單擊按鈕提交表單,從我的處理程序的警告框彈出說,沒有框是檢查,並在我的分貝創建的類別沒有關聯的項目(正確行爲)

2)我然後單擊1複選框,彈出警告框顯示哪些框檢查(正確)。但是,當我提交表格時,數據庫中的類別仍然沒有關聯項目。我可以看到通過螢火蟲和服務器日誌,併發送HTTP查詢包含舊的參數列表,而不是較新的。 (錯誤)

3)然後我再次提交相同的表格,不做任何更改,它顯示了正確的項目數。

所以我覺得參數結構比較滯後。我希望這不會太長,一個人可以幫我弄清楚發生了什麼。

我的問題:

什麼事件,我需要綁定,這樣的形式被用正確的參數提交?或者還有另外一種方式可以完全解決這個問題嗎?

謝謝

這是我的代碼如下。

感謝,

$('#my_form') 
    /* Now we need to configure the checkboxes to create an association between 
    * the items, and the interaction that is being created. First we will bind a 
    * function to the click event, and if the box is then checked, we will add 
    * the item id to the list of interaction items. If it is unchecked, we will 
    * remove the item from the list of interaction items. 
    */ 
    .live('ajax:beforeSend', function(event){ 

     // First get a list of all the checked Items 
     var checked_items = new Array(); 
     $('#items input[type="checkbox"]:checked').each(function(){ 
     checked_items.push(this.getAttribute('data-item-id')); 
     }); 

     // Then add this list of items to the new_interaction form to be submitted 
     $('#interaction_new_items').val(checked_items); 
     alert(checked_items); 
     alert($('#interaction_new_items').val()); 
    }) 

回答

2

綁定到提交按鈕本身的單擊事件。點擊事件將在您的ajax beforeSend事件之前處理。

$('#my_form .submit').click(function() { 
// rest of your code here 
}); 
+0

真棒!謝謝!!!我怎樣才能找出事件的處理順序,以供將來參考? – noli 2011-04-28 14:35:22

+0

我會假設ajax:beforeSend在窗體被序列化後被調用,所以這可能會起作用。 – 2011-04-28 14:35:37

+0

ajax:beforeSend是一個jQuery事件。由於JavaScript是自己的序列化表單,然後使用jQuery通過Ajax提交,所以沒有相應的jQuery事件來滿足你的需求。 – 2011-04-28 14:39:26

0

一個更靈活的解決方案(比如說,如果你想用非點擊的方式提交表單)將綁定到表單的提交事件。

$('#my_form').submit(function() { 
    // Tweak your form data here 
})