Giới thiệu về Sinatra framework
Bài đăng này đã không được cập nhật trong 7 năm
1.Giới thiệu về Sinatra
Sinatra là một thư viện web mã nguồn mở, được viết trong Ruby. Nó có thể được dùng để thay thế cho các framework khác chẳng hạn như Rails, Merb, Nitro, ... Sinatra dựa vào Rack web server và được đặt theo tên của nhạc sỹ Frank Sinatra. Sinatra framework nhỏ và rất linh động, nó không tuân theo mô hình MVC truyền thống trong lập trình web mà tập trung vào triết lý "nhanh chóng tạo ra ứng dụng web bằng ngôn ngữ Ruby với một nỗ lực tối thiểu". Một vài công ty lớn hiện đang sử dụng Sinatra framework cho các web của mình như : Heroku, Github, LinkedIn,...
2.Tại sao sử dụng sinatra?
Sinatra rất nhanh, đơn giản và hiệu qủa trong thiết kế web. Sinatra rất thích hợp cho các ứng dụng web nhỏ mà không cần qúa nhiều nỗ lực trong việc học và tìm hiểu các mô hình lập trình web.
3.Bắt đầu với Sinatra: ứng dụng Hello All!
- Cài đặt gem sinatra :
gem install sinatra
- Ứng dụng đầu tiên rất đơn giản và dễ hiểu nó chỉ bao gồm 2 file:
# app.rb
require 'sinatra'
class HelloAllApp < Sinatra::Base
get '/' do
"Hello, What's Your name?"
end
end
# config.ru
require './app'
run HelloWorldApp
sau khi viết code cho 2 tập tin, ta có thể chạy sinatra bằng dòng lệnh:
rackup
4.Sự khác biệt giữa Sinatra và Rails Framework
Ta có thể so sánh sự khác biệt của Sinatra và Rails qua hai mẫu code cùng một tính năng sau:
Sinatra
get '/ruby' do
api_result = RestClient.get 'http://api.meetup.com/groups.json/?&topic=ruby&order=members&key=XXXXX'
jhash = JSON.parse(api_result)
counter = jhash['results'].count
output = ''
jhash['results'].each do |j|
name = j['name']
city = j['city']
focus = j['who']
count = j['members']
contact = j['organizer_name']
link = j['link']
country = j['country']
output << "<tr><td>#{name}</td> <td><a href = '#{link}' target = _new>#{city}</a></td><td>#{country.upcase}</td><td>#{focus}</td> <td>#{count}</td><td>#{contact}</td></tr>"
end
erb :meetup_table, :locals => {result: output, counter: counter}
end
Rails
class MeetupResource < ActiveResource::Base
self.site = "http://api.meetup.com/"
attr_accessor :api_key
ActiveResource::Base.logger = RAILS_DEFAULT_LOGGER
API_KEY = ""
API_MAX_RESULTS = 200
def self.inherited(klass)
klass.send('element_name=', klass.name.sub(/^Meetup/,"").downcase)
end
module MeetupXmlFormat
extend self
def extension
"xml"
end
def mime_type
"application/xml"
end
def decode(xml)
from_xml_data(
(Hash.from_xml(xml.sub('latin_1','ISO-8859-1'))["results"]["items"] || {}).values.first)
end
private
def from_xml_data(data)
if data.is_a?(Hash)
Array.new.push(data)
else
data
end
end
end
self.format = MeetupResource::MeetupXmlFormat
def self.find(scope, args = {})
if args[:params]
args[:params].merge!({:key => @api_key || API_KEY })
end
super(scope, args)
end
def self.find_everything(options = {})
records = []
each(options) { |record| records << record }
records
end
def self.each(options = {})
options[:params] ||= {}
options[:params][:offset] = 0
options[:params][:page] = API_MAX_RESULTS
loop do
if (records = self.find(:all, options)).any?
records.each { |record| yield record }
if records.size < API_MAX_RESULTS
break
else
options[:params][:offset] += 1
end
else
break
end
end
end
end
Như có thể thấy ở trên Sinatra tập trung vào các chức năng chính thích hợp cho việc viết các ứng dụng web nhỏ còn Rails thì bố trí code rất rõ ràng thích hợp cho các ứng dụng lớn. Nguồn tham khảo: http://www.sinatrarb.com/documentation.html https://blog.engineyard.com/2014/rails-vs-sinatra
All rights reserved