Após o meu primeiro post/tutorial que descreveu como criar uma párgina de perfil usando Sinatra, Haml e Sass, vou me aprofundar mais no tema criando uma outra aplicação de exemplo que explora melhor os conceitos por trás do Sinatra.
O exemplo anterior se resumia a simples GETs Http, mas nós sabemos que aplicações web são muito mais que isso, não é?
Então vamos ao que interessa.
Pré-Requisitos e Preparativos
Será necessário a instalação do sqlite3 em seu computador. Os passos para fazer isso fogem do escopo deste tutorial, mas você não encontrará dificuldades para esse procedimento(usuários de mac não precisam). Após a instalação, crie via linha de comando uma database, como no exemplo abaixo:
sqlite3 blue_eyes
SQLite version 3.4.0
Enter “.help” for instructions
sqlite> .quit
Usaremos algumas gems para nao reinventarmos a roda:
- sinatra – Nosso tão amado e querido micro-framework
- feedzirra – Parsing de RSS
- sequel – Para gerenciamento simples do sqlite com ruby – http://sequel.rubyforge.org
- Haml – Linguagem de marcação para nossos templates
Após instalarmos cada uma das gems necessárias, começaremos o desenvolvimento da aplicação.
Leitor de RSS Feito Totalmente em Ruby!
O idéia é criar um leitor de RSS básico, com as features mínimas necessárias para o seu funcionamento. Melhorias futuras serão tratadas em outros posts. Para que possamos gerenciar nossos feeds, criaremos um Model simples, representando objetos “feed”. Percebam que, assim como os conhecidos exemplos do ActiveRecord usado no Rails, aqui a gente também extende uma classe model do nosso framework de acesso ao BD, o Sequel. É possível notar também a semelhança com um Migration na definição do schema da tabela.
./feed.rb
class Feed < Sequel::Model
unless table_exists?
set_schema do
primary_key :id
text :url
text :name
end
create_table
end
end
Pronto. Nosso Model já está pronto, agora vamos para o Controller. Como essa é uma implementação bem simples, usaremos apenas a raiz do site para apresentar o conteúdo. Isso pode ser comprovado nos GETS que esperam apenas um parâmetro, no caso o "id" do feed no nosso banco.
./blue_eyes.rb
require 'sinatra'
require 'feedzirra'
require 'sequel'
configure do
Sequel.sqlite('blue_eyes.db')
end
require 'feed'
get '/style.css' do
content_type 'text/css', :charset => 'utf-8'
sass :style
end
get '/' do
@feeds = Feed.all
@feed = Feedzirra::Feed.fetch_and_parse("http://www.tbueno.com/blog/feed/")
haml :index
end
get '/:id' do
@feeds = Feed.all
@model = Feed.find(:id => params[:id])
@feed = Feedzirra::Feed.fetch_and_parse(@model.url)
haml :index
end
post '/add_feed' do
f = Feedzirra::Feed.fetch_and_parse(params[:feed_url])
feed = Feed.new(:url => f.feed_url, :name => f.title)
feed.save
redirect '/'
end
Outra novidade em relação ao tutorial anterior é o uso do "configure", que é uma espécie de "initializer" do Rails e é executado, como o nome diz, apenas uma vez no início. Usaremos ele para conectarmos ao nosso banco.
O uso de POST Http foi adicionado para que possamos adicionar feed usando um form simples que recebe a url do feed a ser adicionado.
Camada de Apresentação com Haml e Sass
Como no tutorial anterior, usaremos o Haml e o Sass para geração de HTML e CSS respectivamente. Como esta é uma aplicação pequena, acho que fica interessante usarmos estas ferramentas para demonstrar como fica limpa a parte de apresentação usando elas.
./views/index.haml
%html
%head
%title Blue Eyes
%meta{"http-equiv" => "Content-Type", :content=>"text/html; charset=UTF-8"}
%link{:rel => 'stylesheet', :type =>'text/css', :href => 'style.css' }
%body
#menu
%form{:action => 'add_feed', :method => 'post', :name => 'add_feed'}
%input{:type =>'text', :name => 'feed_url', :id => 'feed_url' }
%input{:type => 'submit', :value => 'Add Feed'}
%ul
- @feeds.each do |f|
%li
%a{:href => "/#{f.id}"}
= f.name
#content
.feed
%h1
%a{:href => @feed.url}
= @feed.title
- @feed.entries.each do |entry|
.entry
%h2
%a{:href => entry.url}
= entry.title
= entry.content
Sempre é bom lembrar que a identação é FUNDAMENTAL no Haml, portanto, preservem-na caso vocês forem copiar e colar estes códigos.
./views/style.sass
body :background-color #f0f0f0 a :color #B84300 :text-decoration none h2 :font normal 1.2em/1.3em arial :margin 0 :padding 0 .entry :border 1px solid #888 :background #f9f9f9 :padding 10px :width 90% :margin-bottom 1em #content :float left :width 70% :margin 0px 0px 50px 0px :overflow auto #menu :float left :width 25% :overflow auto :border 1px solid #888 :margin-right 10px
Screenshot:

Trabalhos Futuros
Obviamente, este exemplo não é uma aplicação completamente funcional. Ele serve mais como um exemplo de como explorar os recursos do Sinatra, mas como eu me diverti fazendo ele, logo tive a idéia de criar um projeto no Github para continuar o desenvolvimento. Sintam-se a vontade para clonar o projeto e sugerir melhorias. Existe uma lista de coisas que precisam ser melhoradas que incluem gerenciamento otimizado de feeds, caches, controle de datas para que os feeds não precisem ser buscados externamente a cada refresh, etc...

Provavelmente eu farei posts futuros descrevendo o desenvolvimento de novas features. Enquanto isso, confiram a página do RSS Reader BLUE EYES.


Comentário(s) deste Post
Existem 2 comentários
Apr 8, 2009 - 4:47 pm
Valeu Thiago! Eu não tenho investido nada no Sinatra mas é muito interessante ver o framework em funcionamento.
Esses dias mesmo eu falei com um colega pra dar uma olhada pra uma mini-app que ele queria fazer, agora vou mandar ele vir aqui conferir os posts a respeito =)
Apr 19, 2009 - 8:08 pm
Muito legal!
Interessante a abordagem do haml e sass junto, muito útil para quem está iniciando, como eu.