12/08/2018, 14:33

Giới thiệu về Sinatra framework

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 ...

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 << "&lt;tr&gt;&lt;td&gt;#{name}&lt;/td&gt; &lt;td&gt;&lt;a href = '#{link}' target = _new&gt;#{city}&lt;/a&gt;&lt;/td&gt;&lt;td&gt;#{country.upcase}&lt;/td&gt;&lt;td&gt;#{focus}&lt;/td&gt; &lt;td&gt;#{count}&lt;/td&gt;&lt;td&gt;#{contact}&lt;/td&gt;&lt;/tr&gt;"
  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

0