Grimm
Grimm is a mini MVC framework written in ruby. It is a look alike of Ruby on Rails. It is light weight and very easy to use.
Installation
From your terminal run:
$ gem install grimm
if you have an existing app, just add the gem to your gem file.
gem "grimm"And then execute:
$ bundle install
Grimm App
Grimm App is the base app for Grimm gem. Clone the app to your local machine:
$ git clone git@github.com:andela-aadepoju/grimm_todo.git
This app is a Todo app. Its will give you an insight on how Grimm can be used.
Understanding Grimm
Grimm Controllers
Controllers are made up of methods often called actions, that are executed on request. It either renders a template or redirects to another action among many othe functions.
For an app using Grimm, the controller class must follow the pattern below.
ApplicationController class inherits from Grimm::BaseController. Every other controller class inherits from ApplicationController e.g ListsController << ApplicationController
class ApplicationController < Grimm::BaseController
end
class ListsController < ApplicationController
def index
@lists = List.all
end
endActions, render template in the app/views folder corresponding to the name of the controller and action after executing code in the action.
For example, the index action of the ListsController would render the template app/views/lists/index.html.erb by default after populating the @lists instance variable.
Also controllers should be named in their pluralized form. Controllers would render its corresponding views without the @lists instance.
The redirect_to method redirects to the specified route
Grimm Models
Models are classes in the models folder. These classes are responsible for communications with the database.
All models should inherit from the Grimm::GrimmRecord. All model classes should be named as a singular object.
Example model class displaying available methods:
class List < Grimm::GrimmRecord
to_table :lists
property :id, type: :integer, primary_key: true
property :title, type: :text, nullable: false
property :body, type: :text, nullable: false
property :created_at, type: :text, nullable: false
property :done, type: :boolean, nullable: false, default: false
create_table
endto_table This method is used to name the table in the database.
property This method is used to define the columns of a table in the database. As seen in the example above, the column type should also be defined on this method.
created_table This method triggers the main table creation.
Grimm Views
Grimm::BaseController sends response to the views either by making use of render method declared within the controller method or by inferring the template to display from the name of the controllers. The render action looks for the corresponding views for every method in the controller. These files must be placed in a folder that has the same name as the controller.
The render method which enables rendering of ERB templates is automatically configured. Objects can be passed from the controller to the view by either assigning them as instance variables or by passing the object as a parameter to the render method:
Having instance variable @lists makes lists object available to views\lists\index.html.erb and this is automatically rendered without explicitly calling the render method.
def index
@list = List.find(params["id"])
endThis method also renders the index template
def index
endParameters
All request parameters, whether they come from a GET or POST request, or from the URL, are available through the params method which returns a hash.
It's also possible to construct multi-dimensional parameter hashes by specifying keys using brackets, such as:
<input type="text" name="lists[title]" value="Title">
<input type="text" name="lists[body]" value="Body">The params can also be extracted into a private method such as lists_params
def lists_params
params[lists]
endRoutes
Routes are HTTP methods paired with a URL matching patter, the first route that matches a request is invoked. Route patterns may include named parameters, which can be gotten from the params hash:
They are defined in the file config/routes.rb
The resources makes available all the routes written below resources :lists
the resources method sets the default routes to the index, new, edit, show, update, delete controller methods.
Where lists is the name of the controller, and all words behind the # are action methods defined in your controller.
The root method is used to set the root path
PostApplication.routes.draw do
root "mypages#index"
get "/all_posts", to: "posts#index"
resources :posts
endIn the case of a request being made to an undefined route an error message is returned.
Running the app
From terminal, run:
$ grimm server
This will lunch the app on port 4500
Development
After checking out the repo, run bin/setup to install dependencies. Then, run rspec spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/andela-aadepoju/grimm. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.