如何更新Rails 3中AJAX提交的隐藏表单字段?

时间:2011-04-28 13:34:54

标签: ruby-on-rails ajax ruby-on-rails-3 jquery

关于Rails 3.0.7和JQuery 1.5.1的问题

概述

我正在尝试做以下事情。我有一个网页,一面有一个表格,我可以创建一个类别,另一面有一个项目列表,每个项目都有一个复选框。我希望能够检查每个项目的复选框,这样当我提交表单来创建类别时,新创建的类别还会通过与每个项目的关联创建一个has_many。

因此,关联部分几乎可以工作,我可以提交已选中复选框的列表,如果我发送已检查项目列表,Rails会在后端创建关联。

问题:

这是不起作用的:

我试图通过Ajax提交表单,所以我想将一个事件句柄绑定到rails.js'ajax:beforeSend'事件,这样它就会扫描我选中的复选框列表和检查的ID一个隐藏的表格领域。

问题是:我尝试获取所有选中框的列表,并在用户单击“提交”按钮时将它们添加到隐藏字段。因此,我想我会在ajax:beforeSend事件处理程序中放置代码。我注意到的是,我注意到,rails.js已经以某种方式处理了表单字段,并在此处理程序触发之前构造了HTTP查询。我通过以下行为注意到这一点:

观察到的行为

1)我可以重新加载一个新页面,单击按钮提交表单,弹出我的处理程序中的警告框,说没有选中框,并且我的数据库中创建的类别没有关联的项目(正确的行为)

2)然后我单击1复选框,弹出警告框,显示选中哪些框(正确)。但是当我提交表单时,数据库中的类别仍然没有关联项。我可以通过firebug和服务器日志查看并发送包含旧参数列表的HTTP查询,而不是更新的参数列表。 (WRONG)

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 个答案:

答案 0 :(得分:2)

绑定到提交按钮本身的click事件。 click事件将在ajax beforeSend事件之前处理。

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

答案 1 :(得分:0)

更灵活的解决方案(例如,如果您希望使用点击之外的其他内容提交表单)将绑定到表单的提交事件。

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