How to make a Ruby Web Application, using Sinatra with the Help of Swoonatra

June 14, 2013

In an effort to get acquainted with Ruby in relation to making web applications, I ended up at a fork in the road. Ruby on Rails or Sinatra, which vehicle to web application nirvana do I choose? Letting my DevOps bias take over I ended up choosing what appears to be a more lighter weight yet powerful DSL in Sinatra.

My goal was to get a feel for setting up a basic web app self contained without thinking to hard about scale just yet. I will cover scaling Sinatra in subsequent blogs. Basically get my feet wet in the world of Ruby MVC and DSL’s.

After much reading, messing around and testing the waters with Sinatra I decided to combine some of the basic things a web app might need and make a template/scaffold of code called Swoonatra which I open sourced on Github. The idea is that through the functional examples given in Swoonatra you can get started quicker without the extra research time I had encountered when using Sinatra.

Step 1 Install Your Basic Prerequisites:

I was working off a CentOS 6 Server depending on what is installed on your server you may need to add the following as superuser:

yum install gcc.x86_64
yum install gcc-c++.x86_64
yum install make
yum install openssl.x86_64
yum install openssl-devel.x86_64
yum install openssl098e.x86_64
yum install diffutils.x86_64
yum install gperf
yum install git
yum install sendmail

Step 2 Install Your Ruby Language and MySQL Server:

 
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
gunzip -c yaml-0.1.4.tar.gz | tar -xvf -
cd yaml-0.1.4
./configure --prefix=/usr/local
make
make install
 
cd ../
 
wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p429.tar.gz
gunzip -c ruby-1.9.3-p429.tar.gz | tar -xvf -
cd ruby-1.9.3-p429
./configure --prefix=/usr/local --enable-shared --disable-install-doc --with-opt-dir=/usr/local/lib
make
make install
 
yum install mysql-server.x86_64
yum install mysql-server-devel.x86_64
yum install mysql.x86_64
mysql_secure_installation
 
mysql -u root -p
CREATE USER 'yourusernamehere'@'localhost' IDENTIFIED BY 'yourpasswordhere';
GRANT ALL PRIVILEGES ON * . * TO 'yourusernamehere'@'localhost';
FLUSH PRIVILEGES;
create database yourdatabasename;

Step 3 Install Some Ruby Gems:

gem install sinatra
gem install unicorn
gem install dm-mysql-adapter
gem install datamapper
gem install bcrypt-ruby
gem install pony
gem install sinatra-flash

Step 4 Clone Swoonatra from Github:

(Do this in the location where you would like your project to be)

git clone https://github.com/nethacker/swoonatra

Now to get up and running you just have to make a few changes to Swoonatra making it custom to your environment

1. In model/model.rb change the dbname/dbpassword/dbname to a mysql server db you have created with a user/password that has access.

DataMapper.setup(:default, 'mysql://dbusername:dbpassword@localhost/dbnamehere')

2. In routes/user.rb change @reset_path to the hostname of your server as well as the Pony Gem Email settings.

if user = Users.first(:email => (params[:email]))
@reset_path = "http://yourhostname/reset?email=#{params[:email]}"

In two places change the following

Pony.mail({
  :from => 'from@email.com',

3. In routes/contact.rb change Pony Gem Email settings.

Pony.mail({
  :from => 'yourfrom@email.com',
  :to => 'yourto@email.com',

Start Your Engines!

Go into the project directory and start the unicorn HTTP server up! Then go to your hostname in a browser.

unicorn -c unicorn.conf -D

One extra note make sure you stop and start unicorn when making changes things other then views to see your changes take effect.

killall unicorn
unicorn -c unicorn.conf -D

Why Swoonatra?

Swoonatra was made to save time in learning Sinatra by seeing some examples and having a template to work from. This is not a replacement for reading the Sinatra or other gem documentation but to help provide examples and a structure. Some good Sinatra books to reference are: Sinatra: Up and Running and Jump Start Sinatra

The code covers usages of DataMapper an Object Relational Mapper written in Ruby using MySQL with a foreign key relationship. Also user signup, sign-in, password reset, session handling. For design the code shows usage of URL routing, views, partial views, layouts, error handling, flash messaging. Also included is samples of emailing data, and there is a basic Unicorn web server configuration. Everything is laid out with a MVC structure. Hope this helps!

Comments are closed.