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

11 July 2010 rails3, cabybara, rvm, mongo, and 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.

Liquid error: Flag value is invalid: -O ””

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,

$ bundler 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