2014-06-06 2 views

Antwort

5

I jTable js und CSS in den Lieferanten-Verzeichnis (jQuery UI benötigt wird, habe ich jquery-ui-rails gem)

Ich habe einen Controller (genannt tables_controller) und verwendet, um ein wenig kompliziert Art und Weise, um es einfach zu installierenden Gebrauch und Schienen freundlich.

Siehe das folgende Beispiel. Ich habe eine spezielle Benennungskonvention verwendet, um den Vorgang zu vereinfachen: Der Name der Felder enthält den Namen der Tabelle und den Namen der Spalte, die durch '__' getrennt ist - zum Beispiel visitors__id. Sie werden sehen, wie es beim automatischen Bestellen hilft.

app/controllers/tables_controller.erb:

class TablesController < ApplicationController 
    def demo 
    respond_to do |format| 
     format.json { 
     page_size = params[:jtPageSize].to_i 
     start_index = params[:jtStartIndex].to_i 
     start_page = start_index/page_size + 1 
     sort_by = params[:jtSorting].gsub('__', '.') 
     filter = params[:filter] 
     if filter 
      @visitors_count = Visitor.joins(:city). 
       where('visitors.name like ? OR cities.name like ?', "%#{filter}%", "%#{filter}%").size() 
      @visitors = Visitor.joins(:city). 
       where('visitors.name like ? OR cities.name like ?', "%#{filter}%", "%#{filter}%").order(sort_by). 
       paginate(:page => start_page, :per_page => page_size) 
     else 
      @visitors_count = Visitor.all.size() 
      @visitors = Visitor.joins(:city).order(sort_by). 
       paginate(:page => start_page, :per_page => page_size) 
     end 
     } 
     format.html {} 
     format.js {} 
    end 
    end 
    def demo_delete 
    @visitor = Visitor.find(params[:visitors__id]) 
    if @visitor 
     if @visitor.destroy 
     render js: '{"Result":"OK"}' 
     end 
    end 
    end 
end 

app/views/Tabellen/demo.json.jbuilder:

json.Result "OK" 
json.TotalRecordCount @visitors_count 
json.Records do 
    json.array!(@visitors) do |visitor| 
    json.visitors__id visitor.id 
    json.visitors__name visitor.name 
    json.visitors__age visitor.age 
    json.cities__name visitor.city.name 
    end 
end 

app/views/Tabellen/demo.html.erb:

<div class="jtable-filter"> 
    <form class="jtable-filter"> 
    <input type="text" name="filter" id="filter"/> 
    <button type="submit" data-jtable-filter="demo">Filter</button> 
    </form> 
</div> 
<div id="demo" data-jtable-config="/demo"> 
</div> 

app/views/Tabellen/demo.js.erb:

var jtable_config = { 
    title: '', 
    paging: true, //Enable paging 
    pageSize: 10, //Set page size (default: 10) 
    sorting: true, //Enable sorting 
    defaultSorting: 'visitors__name ASC', //Set default sorting 
    defaultDateFormat: 'yy-mm-dd', 
    gotoPageArea: 'combobox', 
    actions: { 
     listAction: '/demo', 
     deleteAction: '/demo/delete' 
    }, 
    fields: { 
     visitors__id: { 
      key: true, 
      list: false 
     }, 
     visitors__name: { 
      title: 'Name', 
      width: '30%' 
     }, 
     visitors__age: { 
      title: 'Age', 
      width: '20%' 
     }, 
     cities__name: { 
      title: 'City', 
      width: '20%' 
     } 
    } 
}; 

application.js:

(function ($) { 
    jQuery.fn.jtable_ou = function() { 
     return this.each(function() { 
      var $this = $(this); 
      var config_url=$this.attr("data-jtable-config"); 
      $.getScript(config_url, function(data, textStatus, jqxhr) { 
       $this.jtable(jtable_config); 
       $this.jtable('load'); 
      }); 
     }); 
    }; 
})(jQuery); 

$(document).on("page:change", function() { 
    $('[data-jtable-config]').jtable_ou(); 
    $('button[data-jtable-filter]').click(function (e) { 
     e.preventDefault(); 
     var target=this.getAttribute("data-jtable-filter"); 
     $('#'+target).jtable('load', { 
      filter: $('#filter').val() 
     }); 
    }); 
}); 

Gemfile:

match '/demo', to: 'tables#demo', via: [:get, :post] 
match '/demo/delete', to: 'tables#demo_delete', via: [:post] 

Es ist Turbolink freundlich und unaufdringlich JavaScript verwendet.

Sie können detaillierte Beschreibung in this post finden.