meta_search + datatables - PullRequest
       22

meta_search + datatables

2 голосов
/ 24 ноября 2011

Я использую datatables в своем приложении rails 3.1.Datatables настроен для работы на стороне сервера.Я использую 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 () вызывается и возвращает не отфильтрованные данные.Таким образом, данные в таблице не изменились.Запрос отправляется каждый раз, когда вызывается любая из функций datatables.Как я могу решить проблему?

1 Ответ

0 голосов
/ 25 ноября 2011

Я думаю, что проблема в том, что вы инициализируете таблицу внутри обработчика событий и поэтому дважды вызываете сервер.

$("#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();
});

я думаю, что вы должны убрать инициализацию

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 для этого

...