11 Jun 2010

Começando uma aplicação com Rails3, Capybara, rvm, MongoID e Haml

Ontem iniciamos um novo produto interno na Locaweb e optamos por iniciar o desenvolvimento com um approach diferente do produto que estamos trabalhando atualmente. Decidimos seguir este caminho para poder testar algumas tecnologias de forma ágil em um produto que entregue valor para a empresa, matamos dois coelhos com um sprint só. Então sentei com o Leonardo Bessa e decidimos fazer o bootstrap dessa aplicação com tudo de mais divertido que encontrássemos pela frente, com isso esperamos incentivar os developers do time a trabalhar com algumas coisas que não estão acostumados no dia-a-dia.

Setup do ambiente

Não preciso lembrar que o Rails 3 ainda está em desenvolvimento, mas que ele atingiu um suficiente nível de maturidade que possibilita o seu uso em aplicações pequenas que possam ser refatoradas rapidamente para evoluir juntamente com as novas funcionalidades que estão sendo inseridas, acredito eu, que ele não irá mudar muito em relação a versão recém lançada beta4 esta semana.

Antes de você sair destruindo seu ambiente de desenvolvimento atual para instalar o Rails3 conheça o rvm ele possibilita o uso de vários interpretadores ruby de forma fácil e rápida. Não vou cobrir a instalação do rvm neste post, mas deixo o link para o asciicast#200(link para o screencast original).

Considerando então que você já possui o rvm instalado e configurado, instalamos a versão 1.8.7 do RubyEnterprise Edition que é a minha preferência até então.

$ rvm install ree-1.8.7
$ rvm use ree-1.8.7

Após este passo já contamos com a versão configurada do ree-1.8.7, o que precisamos para evitar o problema do conflito entre as versões de gems do Rails 3 com as outras aplicações rails2 é utilizar um gemset. Está é uma feature muito interessante do rvm pois cria um namespace independente onde você pode ter as versões atualizadas dessas gems sem que elas atrapalhem o restante do seu ambiente.

$ rvm gemset create minhaapp
$ rvm gemset use minhaapp

Após marcarmos a nossa gemset podemos prosseguir instalando as gems necessárias pelo Rails 3 observando que não usamos o sudo justamente para não instalar no ambiente “system”

$ gem install tzinfo builder i18n memcache-client \
rack rake rack-test rack-mount erubis mail text-format thor bundler
$ gem install rails --prerelease

Pronto, agora podemos iniciar o nosso projeto sem peso na consciência.

Iniciando a aplicação

Como já estamos acostumados, preferimos usar jQuery ao invés do prototype é uma preferência pessoal e nada o impede de usá-lo. além do prototype vamos ignorar o Test::Unit, fazemos isso passando o parametro -JT. Além de ignorar jQuery e Prototype, vamos ignorar o active record para que possamos usar o mongoId como orm mapper

$ rails new minha_app --skip-activerecord -JT
    create  
    create  README
    create  Rakefile
    create  config.ru
    create  .gitignore
    create  Gemfile
    create  app
    create  app/controllers/application_controller.rb
    ...

Aproveitamos também para remover alguns arquivos desnecessários para nossa aplicação.

$ cd minha_app/
$ rm public/index.html public/images/rails.png

Se você parar por aqui, fechar seu terminal e tentar continuar depois este tutorial com uma nova sessão, perceberá que o rvm não virá configurado na nova shell, para resolver este problema e evitar que você estando em outro gemset comece a instalar coisas sem controle, você pode criar uma arquivo .rvmrc na raiz da sua aplicação que “avisa” o rvm qual versão do ruby e gemset que você gostaria de usar.

$ echo "rvm ree-1.8.7@minhaapp" > .rvmrc

Rails UJS usando JQuery

O Rails 3 tráz a tona o Javascript não-obstrutivo ou UJS e embora sejam necessárias algumas modificações quando não utilizamos o padrão do Rails, é muito mais fácil do que nas versões anteriores, para isso precisamos simplesmente baixar 2 arquivos para dentro da aplicação.

$ mkdir public/javascripts/jquery
$ curl http://code.jquery.com/jquery-1.4.2.min.js > public/javascripts/jquery/jquery-1.4.2.min.js
$ curl http://github.com/rails/jquery-ujs/raw/master/src/rails.js > public/javascripts/rails.js

E ainda substituir o arquivo application.html.erb por um chamado application.html.haml e nele incluir as referéncias ao jquery.

!!!
%html
  %head
    %title Myapp
    = stylesheet_link_tag :all
    = csrf_meta_tag 

  %body
    = yield

    = javascript_include_tag 'jquery/jquery-1.4.2.min'
    = javascript_include_tag :all, :cache => true

Optamos aqui por usar um jquery embutido na aplicação, mas você pode usar um CDN como o google como link para o jquery. Apenas adicionando a gem do haml ao Gemfile nossa aplicação responderá naturalmente os templates haml que definirmos.

O arquivo Gemfile

Agora temos uma aplicação rails configurada, em partes pelo menos, ainda não temos um orm nem um framework de testes, resolvemos isso modificando o arquivo Gemfile para inserir as novas gems que vamos usar o projeto daqui pra frente, com isso, atendemos as dependências deste projeto e podemos partir pra configuração dos frameworks que vamos usar.

source 'http://rubygems.org'

gem 'rails', '3.0.0.beta4'

gem "mongo_ext" 
gem "mongoid", :git => "git://github.com/durran/mongoid.git"
gem "bson_ext", "1.0.1"

gem "haml"
gem "rails3-generators"

group :test do
  gem "rcov"
  gem "rspec-core",       :git => "git://github.com/rspec/rspec-core.git"
  gem "rspec-rails",      ">= 2.0.0.beta"
  gem "machinist",        :git => "git://github.com/notahat/machinist.git"
  gem "faker"
  gem "ZenTest"
  gem "autotest"
  gem "autotest-rails"
  gem "cucumber",         :git => "git://github.com/aslakhellesoy/cucumber.git"
  gem "database_cleaner", :git => 'git://github.com/bmabey/database_cleaner.git'
  gem "cucumber-rails",   :git => "git://github.com/aslakhellesoy/cucumber-rails.git"
  gem "capybara"
  gem "capybara-envjs"
  gem "launchy"
  gem "ruby-debug"
end

Eu já havia trabalhado com MongoDB, haml, sinatra e saas no ano passado, até colocamos um projeto em produção com eles, na ocasião usamos o mongomapper para o mapeamento desses modelos na aplicação, mas desta vez vamos usar o monogoID por ser uma coisa nova e estamos querendo testar a fundo.

Antes de continuarmos precisamos instalar as gems que definimos no Gemfile,

$ bundle install

É necessário usar um generator para configurar o mongoID,

$ rails generate mongoid:config

Este comando simplesmente criará um arquivo chamado config/mongoid.yml contendo as configurações necessárias para que possamos conectar a um Mongo local. Uma última alteração é necessária se você quiser usar os famosos generators do Rails 3, no config/application.rb

config.generators do |g|
  g.orm                 :mongoid
  g.template_engine     :haml
  g.test_framework      :rspec, :fixture => false, :views => false
end

Isso habilita alguns generators extras que facilitam muito nossa vida no dia-a-dia, como por exemplo instalar o rspec e cumcuber

$ rails g rspec:install
      exist  lib
     create  lib/tasks/rspec.rake
      exist  config/initializers
     create  config/initializers/rspec_generator.rb
     ...

Ao instalar o cucumber habilitamos o capybara ao invés do webrat, o capybara é uma ótima alternativa que habilita algumas funcionalidades e é muito mais flexível, o que facilita e muito a vida do programador principalmente quando é necessário testar interfaces bem elaboradas e com javascript.

$ rails g cucumber:install --capybara --rspec
      create  config/cucumber.yml
      create  script/cucumber
       chmod  script/cucumber
      create  features/step_definitions
      create  features/step_definitions/web_steps.rb
      ...

A partir deste ponto temos um projeto totalmente configurado e pronto para que possamos começar com os códigos que agreguem valor ao produto. Vale lembrar que como estamos falando de uma versão beta do Rails, algumas coisas podem mudar ou parar de funcionar sem nenhuma explicação, logo, é recomendável prestar muita atenção às versões das gems que estamos usando.

O Diego Carion criou um template muito interessante para aplicações em rails3 que eu modifiquei para que atendesse as instruções deste tutorial. Sinta-se livre par utilizá-la, mas não se esqueça de fazer o Setup do ambiente

rails new minha_app --skip-activerecord -JT -m http://github.com/fmeyer/rails3_template/raw/master/main.rb
1 Jun 2010

Novo blog, novos ares.

Ando bem sumido, uns dizem até que ando meio apagado =) mas isto tem uma boa explicação, ano passado decidi tirar um periodo sabático de viagens, conferências e blog, e decidi cuidar um pouco mais da minha saúde. Começou em maio quando perdi a oportunidade de ministrar uma palestra sobre WebSemântica no FISL, após uma viagem à Argentina/Paraguai e Foz pegamos uma gripe suina que nos deixou uns dez dias em isolamento total. Logo depois decidi que havia chegado a hora de resolver meus problemas respiratórios, e iniciei um acompanhamento pré operatório com um ótimo otorrinolaringologista Dr. Antônio Sampaio da otocape. Cirurgia feita tive vinte dias pra decidir o que fazer em diante, havia chegado a hora de ir embora do Rio. 

Iniciei em Março deste ano em meu novo emprego na Locaweb e passado esse periodo inicial de adaptação posso dizer que realmente me arrependo de não ter feito essa troca antes, mas isto é conversa pra uma rodada de cerveja. Atualmente integro o time de SAAS da locaweb e assim que tivermos algumas coisas legais dividirei com voces. 

Esta semana tive a chance de matar a saudade desses eventos que estive tão sumido, e por mais irônico que seja os três foram na mesma semana. O primeiro evento da semana foi o 12 Encontro Locaweb, sempre ouvi falar destes encontros e posso dizer que a adesão é enorme, e serviu de base para eu ter uma boa amostragem dos clientes que devemos nos focar enquanto estamos desenhamos as novas soluções. 

                                                                                 

Montamos um cakedojo no final do evento usando ruby e java, mesmo os participantes na maioria programadores PHP eles adoraram conhecer um pouco dessas linguages.

Logo em seguida participei do codeshow que pareceu em um primeiro momento ser uma ótima oportunidade para eu assistir um seminário de programação e design ao mesmo tempo. Mas que na minha opinião deixou muito a apresentar, denotando um extremo despreparo por parte dos palestrantes. Quando uma empresa que presta consultoria e treinamentos se presta a fazer um evento, espera-se coisa melhor. 

                   

O ultimo foi o Ruby + Rails no mundo real foi bem produtivo, foi onde eu consegui rever as pessoas e conhecer algumas que só tinha contato online. Todas as palestras com conteúdo e tempo necessário para que o palestrante pudesse desenvolver. Kudos para o Leo Bessa com sua palestra de meta programação que mesmo eu não conseguindo assistir arrancava elogios dos presentes durante todo o dia.

                                               

Fernando Meyer

Especialista em desenvolvimento de sofware atualmente trabalhando no time de SAAS da Locaweb em São Paulo.

Meus interesses técnicos são Engenharia de Software, Enterprise Search, Data mining, NLP e Linguistica computacional.

Do lado pessoal me dedico a música, fotografia e raras vezes desenho.

Opiniões expressadas neste blog são de minha responsabilidade e não representam o ponto de vista do meu empregador