# Flexirails
ORM independent table view for Ruby on Rails.
Has support for partial rendering, turbolinks and i18n as well as basic sorting and filtering facilities.
If you want more abstraction you need to build it yourself.
Look at the bright side: want to use bananadb? Go ahead.
Just wrote your self CSV-In-Memory-DB? No Problem.
Reading each row from /dev/null. Sure, why not?
You are in control. Just need to know how!
### Installation
Add `gem "flexirails"` to your `Gemfile`.
### Usage
Now you need two more steps to get going:
1. subclass `::Flexirails::View` or `::Flexirails::ArrayView`.
``` ruby
class PeopleView < ::Flexirails::View
def total
Person.count
end
def query offset, limit
Person.offset(offset).limit(limit)
end
def columns
%w(id name)
end
end
```
2. instanciate your view class in your controller:
``` ruby
class PeopleController < ApplicationController
protected
def people_view
@people_view ||= PeopleView.new(params)
end
helper_method :people_view
end
```
3. render appropriate partials in your views:
``` erb
<%= render :partial => '/flexirails/navigation', :locals => { :view => people_view } %>
<%= render_flexirails_view(people_view, { :class => 'statics' }) %>
```
Columns are translated as `..`, e.g. `de.people_view.name`.
### Advanced Usage
You can pass additional informations to your view - e.g. the current user for complex logic
``` ruby
class PeopleView < ::Flexirails::View
attr_reader :current_user, :current_project
def initialize params, user, project
@current_user = user
@current_project = project
super params
end
def scoped
if current_user.admin?
Person.scoped
else
current_project.people
end
end
def total
scoped.count
end
def query offset, limit
scoped.offset(offset).limit(limit)
end
end
```
By default attributes are extracted from the current row object. But you can render partials if you want to:
``` ruby
class PeopleView < ::Flexirails::View
def total
Person.count
end
def query offset, limit
Person.offset(offset).limit(limit)
end
def columns
%w(id name actions)
end
def render_actions person, context
context.render :partial => "actions", :locals => { :person => person }
end
end
```
You can sort your data if you want to. `order` and `direction` are sanitized by default, no need to check.
``` ruby
class PeopleView < ::Flexirails::View
def query offset, limit
scope = if order_query?
Person.order("#{order} #{direction}")
else
Person
end
scope.offset(offset).limit(limit)
end
def sortable_columns
%w(id)
end
end
```
You can filter your data if you want to:
``` ruby
class PeopleView < ::Flexirails::View
attr_reader :minimum_id
def initialize params
@minimum_id = params.fetch(:minimum_id, nil)
super params
end
def scoped
if minimum_id.present?
Person.where(["id > ?", minimum_id])
else
Person.scoped
end
end
def total
scoped.count
end
def query offset, limit
scoped.offset(offset).limit(limit)
end
end
```
### TODO
- enhance the test suite
- refactor the small, inlined- js a little. its ugly as hell
- refactor the css. its ugly as hell as well
- maybe add a small abstraction for ActiveRecord Views
### Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request