meta_search + datatables

时间:2011-11-24 15:53:55

标签: ruby-on-rails ruby ajax datatables meta-search

我在rails 3.1应用程序中使用数据表。数据表设置为工作服务器端。我正在使用ajax请求从服务器获取数据,然后在表中显示它。

我使用meta_search作为过滤器从数据库中获取数据。

以下是我视图中的代码:

= simple_form_for @search, :url => offer_coupons_path(@offer), :html => {:method => :get} do |f|
= f.select :redeemed_equals,  [['All Coupons', '']] + [["Redeemed", true], ["Not Redeemed", false]]

以下是控制器中的方法:

def offer_coupons_list
  search_params = params[:search] || {"meta_sort"=>"user_full_name.asc"}
  @search = Coupon.search(search_params)
  @coupons = @search.includes(:user).includes(:order => :gift).page(@page)
  render :partial => 'coupons/offer_coupons_list'
end

这是javascript负责向服务器发送ajax请求:

$("#search_redeemed_equals").change(function(e){
    table = $("#grid").dataTable();
    var data = $("#search_redeemed_equals").parents("form:first").serialize();
    $.ajax({
        'url': 'coupons/offer_coupons_list',
        'data': data,
        'type': 'POST'
    });
    table.fnDraw();
    e.preventDefault();
});

问题是脚本向服务器发送两个ajax请求。第一个请求是正确的并返回过滤后的数据。调用fnDraw()时会发送另一个请求,并返回未过滤的数据。因此表中的数据不会更改。每次调用任何数据表函数时都会发送请求。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为问题在于您正在对事件处理程序中的表进行初始化,因此您将服务器调用两次。

$("#search_redeemed_equals").change(function(e){
    table = $("#grid").dataTable();//one call to the server and you use a global variable!
    var data = $("#search_redeemed_equals").parents("form:first").serialize();
    $.ajax({
        'url': 'coupons/offer_coupons_list',
        'data': data,
        'type': 'POST'
    });
    table.fnDraw();//second call
    e.preventDefault();
});

我认为你应该取消inizialization

var table = $("#grid").dataTable();

$("#search_redeemed_equals").change(function(e){
    table = $("#grid").dataTable();//one call to the server and you use a global variable!
    var data = $("#search_redeemed_equals").parents("form:first").serialize();
    $.ajax({
        'url': 'coupons/offer_coupons_list',
        'data': data,
        'type': 'POST'
    });
    table.fnDraw();//second call
    e.preventDefault();
});

如果您已经在页面的另一部分初始化表,只需将表分配给javascript变量并在其上调用fnDraw