Ajax tables engine that respects MVC and goes well with the rails way.
- Rails friendly, relies on partials, scopes, etc.
- Respects MVC, views are for views, models are for models
- Flexible, you write your views in templates and paint them as you pleased
- Unit testable, every moving part is independent and unit-testable
- Light footprint, the whole thing is less than 100 lines of JS
You can find a simple demo-app over here
Add this gem to your Gemfile
gem 'osom-tables'
Make a partial called _table.html.haml
in your resource views
= osom_table_for @things, any_options do |t|
= t.head do
%th Name
%th Size
= t.body do |thing|
%td= thing.name
%td= thing.size
Put it into your index.html.haml
file the usual way
%h1 Things
= render 'table'
Add the following thing into your controller
class ThingsController < ApplicationController
def index
@things = Thing.page(params[:page])
render partial: 'table', layout: false if request.xhr?
end
end
And finally, add the assets to your application.js
and application.css
files the usual way
*= require 'osom-tables'
And you're good to go!
OsomTables don't enforce any sort of dealing with the sorting, just use your standard scopes.
The osom-tables will just handle the views and the params[:order]
for you.
Add the order keys to your t.head
section like so
= osom_table_for @things do |t|
= t.head do
%th{order: 'name'} Name
%th{order: 'size'} Size
= t.body do |thing|
%td= thing.name
%td= thing.size
This will handle the params[:order]
automatically, which you can use in your controllers say like that
class ThingsController < ApplicationController
def index
@things = Thing.page(params[:page]).order_by(params[:order])
render parital: 'table', layout: false if request.xhr?
end
end
And then in your models, for example like that
class Thing
scope :order_by, ->(param) {
sort = param.ends_with?('_desc') ? 'DESC' : 'ASC'
case param.sub('_desc', '')
when 'name' then order("name #{sort}")
when 'size' then order("size #{sort}")
else scopped # fallback
end
}
end
And don't forget to enjoy the awesomeness of easily unit-testable code!
OsomTables can easily hook you up with the html5 push-state goodness.
Yes, it's just like pjax
(whoever come up with this name) only better
coz it renders only what needs to be rendered.
To switch push state on, just pass the push: true
option with your table
= osom_tables_for @things, push: true do |t|
...
By default osom-tables
will use your current url as the base one. But,
in case you would like to reuse the _table
partial, in different locations,
you do so, but specifying the url: smth_path
option with your tables
= osom_tables_for @things, url: other_things_path do |t|
...
All code in this repository is released under the terms of the MIT license
Copyright (C) 2013 Nikolay Nemshilov