13/2/2008 | Tags:novas ferramentas, programação, ruby, sinatra, tradução | Escrito por: Dirceu Pauka Jr.
* Esse artigo é baseado em Sinatra Tutorial. A good starting point por Ari Lerner. Você pode encontrar outras informações no RubyForge (Sinatra)
Sinatra é um framework para linguagem Ruby extremamente leve. Ele roda tendo como base o servidor Mongrel, servindo com muita rapidez as requisições.
Por não ter a extensa biblioteca de “helpers” que o Rails tem e também por não seguir a linha MVC de Rails e Merb, o seu uso não é indicado em grandes aplicações.
Com foco em Web Services e pequenos aplicativos, Sinatra é uma ótima solução para rodar pequenas aplicações desenvolvidas em Ruby com muita eficiência.
O propósito do artigo é ser um guia de inicio para quem quer aprender mais sobre o framework, para isso vamos desenvolver um pequeno “own-microblog”…
Eu vou supor que você já tem conhecimento nessa linguagem e que a ferramenta gem não seja desconhecida. Então vamos começar instalando o gem do Sinatra:
Uma vez que o Sinatra deixa aberta a opção de escolher um ORM (activerecord, DBI, DataMapper…) você precisa ter também o gem de um deles instalado. Minha opção aqui é pelo Sequel:
Vamos agora cuidar da base de dados. Baixe o arquivo vendor.rar e coloque o diretório vendor dentro da raiz do seu projeto. Isso funcionara para conectar a aplicação e o BD. Por padrão o Sinatra carrega os arquivos init.rb dos diretórios de dentro da pasta vendor.
Se você abriu algum dos arquivos da pasta vendor já percebeu que será usada uma base de dados Sqlite. Como ensinar a instalar todas essas funcionalidades fogem do escopo de apresentar o Sinatra, peço para que o leitor faça sua pesquisa nesse assunto.
Por padrão foi definido que a base se chamará sqlite:///microblog.db.
Você pode ainda fazer sua própria conexão utilizando algo parecido com:
Com tudo instalado e configurado, é hora de criar nossa aplicação que como já falado será um pseudo microblogging.
Crie um arquivo chamado microblog.rb – ou baixe o meu pronto -, esse será o primeiro e último arquivo do nosso aplicativo!
Nele adicione:
Acredite, isso já seria o suficiente para rodar o Sinatra!
Como vamos rodar sqlite junto com Sequel:
E para conectar com a base:
A configuração das tabelas tem sintaxe parecida com migrations do Rails:
Isso ira gerar uma tabela de posts quando a aplicação for iniciada.
Agora já podemos usar a base de dados tranqüilamente dentro do projeto. Para facilitar, vamos criar um helperposts:
No sinatra os helpers são definidos dentro do bloco “helpers” como acima. O que foi feito é criar um atalho para o método do Sequel que acessa a tabela de posts.
Para a pagina inicial vamos fazer uma listagem dos “micro-posts”:
Se você estava acostumado com Rails: definir routes, criar um model, o controller e a view, esqueça! Aqui em uma tacada só você tem um route o controller e a view. E o model? Lembra do setup_tables? Então… é tipo lá.
Não se assuste! Nem tudo precisa ser dessa forma (html em meio de código). Sinatra tem um ótimo sistema de templates que usa o Erb (mesmo usado pelo Rails).
O bloco body do Sinatra força que o conteúdo que estiver dentro seja a saida do aplicativo (o retorno para o navegador).
Para entender melhor como funciona as “rotas” no Sinatra, um bloco assim na aplicação:
Vai responder todos requests do tipo GET para ‘/hello_world’. Se você escrever uma string ali dentro ou ainda utilizar o bloco body, o que estiver dentro vai ser o retorno para o navegador
Dentro do bloco get ‘/’ nós utilizamos um método chamado new_post_link que deve ser adicionado ao helper:
Vamos agora criar um bloco que irá servir para adicionar um novo update no pseudo microblog:
Com o formulário para inclusão pronto, falta o método que irá jogar isso para a base de dados:
Pronto! Aqui o Sinatra vai capturar o request do tipo POST “/create”, o método insert (Sequel) vai jogar o conteúdo do form para dentro da tabela posts na base de dados e o método redirect do Sinatra vai redirecionar para página inicial.
Agora vamos permitir a edição dos updates. No nosso metodo get ‘/’ já temos um link (em cima do post) para uma rota ‘/:id’ vamos a ela:
E claro a parte que cuida de atualizar o registro na BD:
Pronto! Temos um pequeno aplicativo rodando sobre o framework Sinatra! Muito simples, fácil e rápido.
É claro que o framework não é só isso. Sinatra tem capacidades que vão muito além que nossa aplicação de demonstração! Se você ficou interessado não deixe de pesquisar a documentação do Sinatra.
Veja uma aplicação que roda Sinatra: moourl da FLEXCODE.
Arquivos
\”oi\”
\’k\’



6 Comentários so far
Leave a comment
Hehe… nem consegui fazer funcionar o sinatra, pra testar…
By Jader on 02.29.08 8:58 pm | Permalink
Cara, eu sou um mero estudante ainda. E não tem coisa pior que um programa necessário não rodar quando a gente quer.
Você sabe dizer porque será que ele não está funcionando no meu PC?
Já instalei usando o:
>gem install sinatra
e instalou tranquilo. Mas quando eu digito no console:
>sinatra
é retornado que esse não é reconhecido como um comando interno…
Que será que é, hein?
By Jader on 02.29.08 9:04 pm | Permalink
Eu também sou estudante rapaz!
Para você poder brincar com o Sinatra dentro do console do Ruby (IRB), você precisa digitar irb no console, e então dentro dele:
require ‘rubygems’
require ’sinatra’
Então fique a vontade para fazer tudo que eu disse no artigo, ou faça um simples “hello world”:
get ‘/’
”fala véio mundo!”
end
By Dirceu Pauka Júnior on 03.01.08 2:05 am | Permalink
Eu utilizo o Sinatra ha algum tempo e discordo de algumas de suas afirmacoes:
1.”Ele roda tendo como base o servidor Mongrel”
:: Ele procura qual server vc tem instalado na sua maquina e roda o que ele encontrar e se vc tiver mais de um, ele ainda procura pelo mais adequado.
2. Por não ter a extensa biblioteca de “helpers” que o Rails[bb] tem e também por não seguir a linha MVC de Rails e Merb, o seu uso não é indicado em grandes aplicações
::a decisao de seguir ou nao MVC fica a escolha do desenvolvedor, ao contrario do Rails q te obriga ao MVC (minhas app Sinatra sao MVC)
::pq nao seria indicado p grandes apps, na real prefiro fazer grandes app com o Sinatra do q com o Rails, pois o Sinatra eh uma fina DSL sobre o Rack eqto o Rails ta ainda se adaptando para rodar sobre o Rack
Mas tenho visto comentarios assim em varios blogs, inclusive falando no irc com o Mizerany, ele mesmo me disse q pretente lancar um artigo desmitificando esta historia de q o Sinatra eh para pequenas apps ou para web services.
By SohDubom on 02.24.09 11:46 pm | Permalink
@SohDubom
Esse artigo foi escrito a algum tempo. Algumas opiniões minhas mudaram e entram de acordo com seu ponto de vista.
Recentemente tenho rodado minhas apps Sinatra em clusters de servidores Thin.
Os helpers do Rails também não são mais tão importantes para mim. Utilizei Merb durante bastante tempo e para um grande projeto na boo-box então Rails não é mais importante mesmo.
Ainda tenho minhas considerações sobre “grandes apps”:
Existem diferenças entre “projeto grande com poucos usuários”, “projeto pequeno com muitos usuários” e “projeto absurdamente grande com número absurdo de usuários”.
Tendo enfrentado esses tipos no último ano, com enfase no “projeto gigante com muitos usuários” o qual foi executado com Merb, continuo tendo a mesma opinião sobre o Sinatra.
No final do projeto era para eu ter escrito sobre como foi ter usado Ruby (Merb), MySQL e CouchDB + Memcached para armazenar milhões (o CouchDB tem dezenas de milhões de “rows”) de informações sobre produtos.
Hoje o projeto em questão é a maior API de produtos brasileira. O BuscaPé, mesmo do tamanho que é, ainda não possui API de produtos aberta (existe em beta) e sente dificuldades em sua implementação.
De qualquer forma, é sempre bom poder trocar opiniões com outras pessoas que se interessam por Ruby como linguagem e não se importam com Rails.
Obrigado pelo comentário, abraços.
By Dirceu Pauka Jr. on 02.25.09 3:28 am | Permalink
Eh isso ai Dirceu … muito legal q vc continua firme com o Sinatra e concordo com o que podemos chamar de ‘projeto grande’, conforme vc explicou.
Na real, a minha critica com esse lance de ‘projeto grande’ tem mais haver com o excesso de ‘pre-preocupacao’ q muitas pessoas tem. Acho q eh o mesmo erro q cometemos com ‘pre-otimizacao’ (http://c2.com/cgi/wiki?PrematureOptimization) … a real eh q a maioria dos projetos nao sao ‘tao’ grandes assim … neste aspecto acho extremamente dificil conversar com ‘certos’ gerentes de projetos q nao conseguem (ou nao querem) sair do Java/Oracle ou .Net/SqlServer para fazer prjetos q ate com PHP seria mais adequado (primeiro pq eu defendo ling. interpretada e dinamica)
Mas eh isso, o legal eh q existem pessoas q conseguem ver a coisa ‘from outside of the box’
Um grande abraco e sucesso!
By sohdubom on 02.26.09 9:08 am | Permalink
Deixe um comentário
Quebras de linha e parágrafo automáticas, seu email nunca será mostrado, HTML permitido:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>