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