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, :datatables def search @products = Product.search(params[:search]).paginate(:page => params[:page], :per_page=>params[:per_page]) respond_with @products end
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/search def search @products = Product.search(params[:search]).paginate(:page => params[:page], :per_page=>params[:per_page]) respond_with @products end
In your search view (app/views/products/search.jsonify):
@products.each do |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.