Sinatra, being a small framework (Domain Specific Language) is a great place to start if you want to fully comprehend
what is going on behind the scenes when using rails fancy metaprogramming. Adapting the MVC model in Sinatra has
made the transition pretty smooth between the two frameworks. The main difference is that Rails give us multiple
boilerplate codes essential from front to back to work with compare to Sinatra, where we have to code every part of the
MVC from scratch. The downside is that Rails generators give us more boilerplate code than we need, and it might take a
good amount of time to clean up the unused files. However, we can exclude unecessary boilerplates for our app by using
the options available after running ` rails new –help` . We will discuss how to
generate the MVC model and routes in Rail Vs Sinatra.
1. Routes Drawing
* Sinatra
class BlogApp < Sinatra::Base
get "/posts" do
@posts = Post.all
erb :index
end
get "/posts/new" do
erb :new
end
post "/posts" do
Post.create(params[:post])
redirect '/posts'
end
get "/posts/:id" do |id|
@post = Post.find(id.to_i)
erb :show
end
get "/posts/:id/edit" do |id|
@post = Post.find(id.to_i)
erb :edit
end
put "/posts/:id" do |id|
@post = Post.find(id.to_i)
@post.update(params[:post])
redirect "/posts/#{id}"
end
delete "/posts/:id" do |id|
Post.delete(id.to_i)
redirect "/posts"
end
end
* Rails
Rails.application.routes.draw do
resources :posts
end
Rails creates all seven RESTFUL routes with one single line of code and link those to their respective controller action. All is left to do is to add the logic and the view. It is important to know Rails naming convention as it emphasizes convention over configuration. This makes Rails efficient when it comes to separate concerns. Unlike Sinatra, routes are defined in a separate file and linked to controllers actions and view by naming convention. However, we can also tell rails explicitely to direct the request to a specific controller action or render a specific view. Also, Rails makes it easier to define nested routes.
Rails.application.routes.draw do
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
get 'signup', to: "users#new"
root 'static_pages#home'
get '/home', to: "static_pages#home"
resources :users
resources :books, only: [:show, :index, :destroy] do
resources :discussions, only: [:new, :show, :index]
end
resources :discussions, only: [:index, :new, :show, :create, :destroy]
end
class UsersController < ApplicationController
def new
# render "new"
end
end
2. Model View Controller
* Sinatra
As shown above, sinatra gives no boiler plate to start with. The developer must code every single part of the MVC plus the related migrationns. Plus, since the browser only recognize GET and POST, as HTTP verbs, we have to manually configure our sinatra app to accept PUT and DELETE functionality:
class Server < Sinatra::Base
set :method_override, true
#other things omitted
end
#Inside the form, include a hidden input, as follows
* (the value field specifies the verb to use):
<input type="hidden" name="_method" value="put">
* Rails
Rails provides generators that structure our directory for us by writing boilerplate code, so that we do not have to manually structure our app from scratch. Taking the User model for example, we can use:
rails generate model User name:string
this will generate a user model with the associated migration
rails generate controller Users new
this will generate the users controller with the new action. This will also creates a corresponding view file and helper for the view
If needed, we can also reverse a generator by running rails destroy
like rails destroy controller ...
. This will delete all files the generator created, which is time efficient.
Last, we can also use rails scaffold to create a quick demo of the app. It automatically generate a simple set of a model, views and controller. This is great to use only to learn how Rails works by going over the code generated by the scaffold.
rails generate scaffold user name:string age:integer
Learning Sinatra first helped me to understand Rails magic. It was definitely the process of learning to walk first before being able to run.