Tableview
Tableview is a gem to be used in Rails to create table like views.
Installation
In your Gemfile:
gem 'tableview'
then
$ bundle install
$ rails g tableview:install
Usage
To apply to a resource use the built in generator:
$ rails g tableview resource_name
This will create a partial named _table.tv
in which you can use a DSL like this to define your table:
=> @registrations
+ :first_name
+ :surname
+ :address {|reg| reg.address + "\n" + reg.postcode }
+ :friends if format.html?
if format.xls?
= @registrations.some_scope, "Workbook title"
= @registration.other_scope, "Works as title in other formats as well"
end
DSL
The DSL is a simple superset of ruby with a few special characters (only work if first printable character on line, won't work with eval and friends).
Character | Meaning |
---|---|
=> |
Use the passed collection for rendering and I18n |
* |
Pass a hash to this, is used to configure the formatters. |
+ |
Defines a column. If passed a symbol, Tableview will use I18n to lookup the header and call the method on the model to get the value. Strings will be used literally. Optionally use a block to generate values. |
= |
Render a subtable for the passed collection. Not all formatters support subtables, use at own risk (notably the CSV formatter has no support for this). Is meant mainly to have nice full-featured excel files. |
What if I don't like the DSL?
You may simply create a .rb
file instead, it will just have to include some boilerplate code (same result as above):
format = Tableview::Helper::Format.new(params)
tv = Tableview::ViewHandler.table do |table|
table.table_for @registrations
table.column :first_name
table.column :surname
table.column :address {|reg| reg.address + "\n" + reg.postcode }
table.column :friends if format.html?
if format.xls?
table.generate_subtable_for @registrations.some_scope, "Workbook title"
table.generate_subtable_for @registration.other_scope, "Works as title in other formats as well"
end
end
output = Tableview::output_class(params[:format]).new
output.process(tv)
output.to_s
It will also add a few lines of code to your controller:
self.responder = ApplicationResponder
this sets up the correct code path to use for dynamically rendering all the formats.respond_to :html, :json, :csv, :xls, :ascii
a list of supported formats. You will want to userespond_with
as well.