Connects two awesome plugins - Datatables for Jquery and Meta Search together for Rails 3.1
Add the following to your Gemfile to install simple datatables:
gem'simple_datatables'
After bundle install add this line to rails 3.1 assets pipeline and restart server:
//= require simple_datatables
Installation completed.
There are two ways to map awesome Datatables plugin request fields for Rails.
First is to convert request on the server side
Second is to prepare correct request on the client side
This gem provides interface for the second way. To use it you should do the following easy three steps:
Create simple meta_search and will_paginate (optionally) controller action as usual and add “.datatables” format
respond_to:html, :datatablesdefsearch@products = Product.search(params[:search]).paginate(:page=>params[:page], :per_page=>params[:per_page]) respond_with@productsend
Use standard datatables initializer options for creating table:
bServerSide: true
sAjaxSource: path to your controller
fnServerData: point to simpleDatatables function
aoColumns: you should define all searchable/fiterable sName attributes here. Use format as used in meta_search (with underscores)
Create Jsonify view with column values for columns listed in aoColumns. See example for clarification.
This gem uses:
meta_search for nice search and sort request syntax mapping
jsonify for simple output generation
This gem provides integration with:
will_paginate for nice pagination request syntax mapping
Gem works only with rails 3.1.
Gem includes datatables library and fnSetFilteringDelay plugin so you haven’t include it by yourself.
Simple_datatables is compatible with will_paginate. Datatables will provide you “page” and “per_page” request params.
If you do not use pagination do not forget to save search result to some variable with meta_search relation method:
@products = Product.search(params[:search]).relation
Note that fulltext search will work only with text fields due to meta_search restrictions. To prevent errors use bSearchable: false for non-text columns in aoColumns field.
Due to meta_search restrictions it is impossible to use regex search for now.
Instead, this gem recognizes bSearch flag as “contains” meta_search finder.
By default “starts_with” is used due to database performance reasons.
Independent fields search will always search using “starts_with” finder.
If you are getting strange results (for instance, iTotalRecords and iTotalDisplayRecords both equal 0, or entirely the wrong collection is used), you might want to specify which collection to use:
respond_with@products, :locals=> {:collection=>@products}
Also if you are using own or uncommon implementation of pagination you may use direct page count variables setting as follows:
respond_with@products, :locals=> {:total_entries=>12, :current_page_entries=>10}
In this case gem will not try to find collection or pagination and will use the counters passed via locals.
The following code will show products list datatables. Manufacturer is belongs_to association for Product.
In your controller:
respond_to:html, :datatables# GET /products/searchdefsearch@products = Product.search(params[:search]).paginate(:page=>params[:page], :per_page=>params[:per_page]) respond_with@productsend
In your search view (app/views/products/search.jsonify):
@products.eachdo|product|json<< [product.name, product.manufacturer.name] end
In your index view:
%table#products %thead %tr %th= Product.human_attribute_name :name %th= Product.human_attribute_name :manufacturer %tbody
In your javascript:
$("#products").dataTable({
"sAjaxSource" : "/products/search.datatables",
"aaSorting" : [[0, 'asc']],
"aoColumns" : [
{"sName":"name"},
{"sName":"manufacturer_name"},
],
"bServerSide" : true,
"fnServerData" : simpleDatatables
});Copyright © Grigory Dmitrenko, 2011. See LICENSE for details.