Giới thiệu về Sinatra framework
Bài đăng này đã không được cập nhật trong 8 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
 
  
 