2011-11-24 4 views
2

난 내 레일 3.1 응용 프로그램에서 datatables를 사용하고 있습니다. Datatables는 서버 측에서 작동하도록 설정됩니다. 아약스 요청을 사용하여 서버에서 데이터를 가져 와서 테이블에 표시합니다.meta_search + datatables

데이터베이스에서 데이터를 가져 오기 위해 메타 검색을 필터로 사용합니다. 여기

= 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 

그리고 여기에 서버에 아약스 요청을 전송에 대한 책임 자바 스크립트입니다 :

$("#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 함수가 호출 될 때마다 전송됩니다. 어떻게 문제를 해결할 수 있습니까?

답변

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

난 당신이 이미

에 fnDraw 그냥 자바 스크립트 변수에 테이블을 지정 페이지의 다른 부분에서 테이블을 초기화하고 호출하는 경우는 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(); 
}); 

을 가지고해야한다고 생각