Posted by
arungupta on April 29, 2009 at 6:21 AM PDT
TOTD
#79 showed how to run a trivial
Sinatra
application using
GlassFish
Gem. Sinatra
provides support for
Haml,
Erb,
Builder,
Sass,
and Inline templates as
described here.
This TOTD will show how to get started with creating a Sinatra CRUD
application using Haml templates.
 |
Haml is based on one primary principle - Markup should be beautiful
because beauty makes
you faster.
Get started by installing the Haml gem as:
/tools/jruby-1.2.0 >./bin/jruby
-S gem install haml --no-ri --no-rdoc
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed haml-2.0.9
1 gem installed |
And follow the tutorial,
documentation,
and reference
page for more details.
|
Sinatra is ORM-agnostic and so any Ruby ORM framework such as
ActiveRecord,
DataMapper,
Sequel,
and others. DataMapper with JRuby
requires
work so this TOTD will show how to use ActiveRecord instead.
There is
sinatras-hat
which allows to create RESTy CRUD apps with Sinatra. There probably are
mutiple other ways to create this application but I prefer to
understanding the wiring so this blog will use a bare minimal structure.
Anyway, lets get started!
- Create the database as:
~/tools/jruby/samples/sinatra-sample >mysql --user root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 664
Server version: 5.1.30 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create
database hello_development;
Query OK, 1 row affected (0.00 sec)
mysql> use
hello_development;
Database changed
mysql> CREATE
TABLE `runners` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY,
`distance` float, `minutes` int(11), `created_at` datetime,
`updated_at` datetime);
Query OK, 0 rows affected (0.06 sec) |
- Update "hello.rb" from TOTD
#79 such that it looks like:
require 'rubygems'
require 'sinatra'
require 'activerecord'
## Setup
ActiveRecord::Base.establish_connection(
:adapter => "jdbcmysql",
:host =>
"localhost",
:username => "root",
:password => "",
:database => "hello_development"
)
## Models
class Runner < ActiveRecord::Base
end
## Controller Actions
get '/hi' do
"Hello World!"
end
get '/' do
@runner = Runner.find(:all)
haml :index
end
get '/new' do
haml :new
end
get '/:id' do
@runner = Runner.find(params[:id])
if (@runner)
haml :show
else
redirect '/'
end
end
post '/' do
@runner = Runner.new(:distance => params[:distance],
:minutes => params[:minutes])
if @runner.save
redirect "/#{@runner.id}"
else
redirect '/'
end
end
|
Firstly, it pulls in the ActiveRecord dependency. Then
"ActiveRecord::Base.establish_connection" is used to establish a
connection with the previously created database. "Runner" is tagged as
a model class by inheriting from "ActiveRecord::Base" and uses the
default table name ("runners" in this case). Add four new methods:
- Three GET methods to show all the runners, a form to
enter new data, and show a particular log entry. Each method requires a
HAML template (will be created in next step) to render the information.
- One POST method to save the newly created log entry in
the database.
- Create a new directory "views" and create the following
files in that directory. Each file serves as a view and rendered from
an action in "hello.rb".
- "index.haml": Show all the runners
%h1 Listing all runners ...
%table
%tr
%th Distance
%th Minutes
- @runner.each do |r|
%tr
%td= r.distance
%td= r.minutes
%br
%a{:href=>"/new"}
New Runner |
- "new.haml": Enter a new entry
%h1 Adding a new runner log ...
%form{:method=>"post", :action=>"/"}
Distance:
%input{:type=>"text", :name=>"distance"}
%br
Minutes:
%input{:type=>"text", :name=>"minutes"}
%br
%input{:type=>"submit", :value=>"Submit"}
%br |
- "show.haml": Show a particular log entry
%h1 Showing a runner log ...
Distance:
= @runner.distance
%br
Minutes:
= @runner.minutes
%br
%br
%a{:href=>"/"}= "Show All!" |
The complete directory structure looks like:
.
./hello.rb
./views
./views/index.haml
./views/new.haml
./views/show.haml |
That's it, now run the application as:
~/tools/jruby/samples/sinatra-sample >../../bin/jruby -S glassfish
Starting GlassFish server at: 192.168.1.145:3000 in development
environment...
Writing log messages to:
/Users/arungupta/tools/jruby-1.2.0/samples/sinatra-sample/log/development.log.
Press Ctrl+C to stop. |
The main page is available at "http://localhost:3000/" and looks like:
Clicking on "New Runner" gives ...
Enter the data, and click on "Submit" to show ...
Click on "Show All!" to see all the entries added so far ...
And after adding few entries the main page looks like ...
This application shows Create and Read from the CRUD, it's fairly easy
to add Update and Delete functionality as well but that's an excercise
left for the readers :-)
You'll hear all about it at
Develop
with Pleasure, Deploy with Fun: GlassFish and NetBeans for a Better
Rails Experience at
Rails Conf
next week.
Technorati: totd
glassfish
jruby
sinatra
crud