Muitos tutoriais de Rails para iniciantes, para demonstrarem na prática como é rápido e simples criar aplicações web com ele, explicam como criar um blog em 15 minutos, baseados no screencast do David Heinemeier Hansson, criador do Rails, para o FISL 6.0. Apesar de ser uma aplicação funcional de blog, com opção para criar posts e adicionar comentários, é bastante limitado.

O Typo é uma aplicação desenvolvida em Rails para criação de blogs bastante completa (inclusive encontrei este blog criado com ele). Ele lembra muito o Wordpress, acredito que tenha sido inspirado nele. A interface de administração é muito semelhante à do Wordpress, apresentando basicamente as mesmas opções: criar posts e páginas, ver/aprovar/rejeitar comentários, criar usuários, customizar a barra lateral, etc. Há também uma opção para seleção de temas (outros temas podem ser encontrados aqui) e plugins com diversas funcionalidades, como APIs para Delicious, Flickr, Twitter e outros. Só senti falta das opções de estatísticas de acesso que o WordPress oferece.

A instalação pode ser feita através do comando gem (gem install typo), porém, tentei e não consegui instalar desta forma. Instalei a ferramenta pela versão tgz. Neste caso, basta descompactar a aplicação, copiar o arquivo database.yml.example, no diretório config, para database.yml, editá-lo conforme a configuração do banco de dados, e em seguida executar rake db:create para criar a estrutura do banco de dados. Caso você queira ser avisado por email quando receber comentários nos posts, copie também o arquivo config/mail.yml.example para mail.yml no mesmo diretório, e edite as configurações de SMTP.

O Typo também possui um servidor de feeds RSS/Atom. Porém, na versão atual (5.1.3), recebi uma mensagem de erro ao tentar acessar os feeds. Encontrei o erro no arquivo app/models/article.rb e corrigi substituindo o método link_to_author? (linhas 384 a 386) pelo seguinte:

def link_to_author?
  begin
    !user.email.blank? && blog.link_to_author
  rescue NoMethodError
    return false
  end
end

Um recurso interessante do Google Talk, mas pouco divulgado, são os bots de tradução de textos para diversas línguas. O Google Translate também faz isso, de uma forma mais limitada, mas para a tradução rápida de um texto pequeno, esse recurso pode ser bem útil.

Para traduzir de português para inglês, adicione o seguinte contato ao seu Google Talk: [email protected] . Tudo o que você escrever para este bot, ele responderá traduzido para inglês. Para a tradução inversa, adicione [email protected] . Para outras traduções, veja este link.

PS: O Google Translator tem um famoso bug onde, ao digitar “USA é o pior país do mundo” e selecionar a tradução de português para inglês, a tradução fica “Brazil is the worst country in the world”. Resolvi fazer esse teste no Google Talk, e descobri que o resultado é o mesmo…


Ontem foi lançada a versão final do Firefox 3.0. Porém, como esta versão ainda não está disponível nos respositórios oficiais do Ubuntu, resolvi fazer o download e a instalação manualmente. Por segurança, optei por manter instalada a versão 2, para o caso de encontrar algum problema, ou alguma extensão que considero essencial não funcionar.

Primeiramente, fiz o download do Firefox 3.0. Em seguida, movi o diretório da versão anterior para outro nome:

cd /usr/lib
sudo mv firefox firefox-2.0

Descompactei o Firefox 3.0 neste mesmo local, e movi o diretório para firefox-3.0, criando em seguida um link simbólico para firefox. Desta forma, fica mais fácil voltar a utilizar o Firefox 2 caso eu necessite:

sudo tar xvfj firefox-3.0.tar.bz2
sudo mv firefox firefox-3.0
sudo ln -s firefox-3.0 firefox

Em seguida, você deve habilitar os plugins. Verifique no diretório plugins do Firefox 2 os plugins que estão habilitados:

ls -l /usr/lib/firefox-2.0/plugins/
total 12
lrwxrwxrwx 1 root root   37 2008-05-26 10:03 flashplugin-alternative.so -> /etc/alternatives/firefox-flashplugin
lrwxrwxrwx 1 root root   39 2008-02-28 14:19 libjavaplugin.so -> /etc/alternatives/firefox-javaplugin.so
lrwxrwxrwx 1 root root   36 2008-02-28 14:10 libtotem-basic-plugin.so -> ../../totem/libtotem-basic-plugin.so
lrwxrwxrwx 1 root root   37 2008-02-28 14:10 libtotem-basic-plugin.xpt -> ../../totem/libtotem-basic-plugin.xpt
lrwxrwxrwx 1 root root   34 2008-02-28 14:10 libtotem-gmp-plugin.so -> ../../totem/libtotem-gmp-plugin.so
lrwxrwxrwx 1 root root   35 2008-02-28 14:10 libtotem-gmp-plugin.xpt -> ../../totem/libtotem-gmp-plugin.xpt
lrwxrwxrwx 1 root root   36 2008-02-28 14:10 libtotem-mully-plugin.so -> ../../totem/libtotem-mully-plugin.so
lrwxrwxrwx 1 root root   37 2008-02-28 14:10 libtotem-mully-plugin.xpt -> ../../totem/libtotem-mully-plugin.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:10 libtotem-narrowspace-plugin.so -> ../../totem/libtotem-narrowspace-plugin.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:10 libtotem-narrowspace-plugin.xpt -> ../../totem/libtotem-narrowspace-plugin.xpt
-rw-r--r-- 1 root root 9104 2008-04-18 13:43 libunixprintplugin.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-dvx.so -> ../../mozilla/plugins/mplayerplug-in-dvx.so
lrwxrwxrwx 1 root root   44 2008-02-28 14:15 mplayerplug-in-dvx.xpt -> ../../mozilla/plugins/mplayerplug-in-dvx.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:15 mplayerplug-in-qt.so -> ../../mozilla/plugins/mplayerplug-in-qt.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-qt.xpt -> ../../mozilla/plugins/mplayerplug-in-qt.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:15 mplayerplug-in-rm.so -> ../../mozilla/plugins/mplayerplug-in-rm.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-rm.xpt -> ../../mozilla/plugins/mplayerplug-in-rm.xpt
lrwxrwxrwx 1 root root   39 2008-02-28 14:15 mplayerplug-in.so -> ../../mozilla/plugins/mplayerplug-in.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-wmp.so -> ../../mozilla/plugins/mplayerplug-in-wmp.so
lrwxrwxrwx 1 root root   44 2008-02-28 14:15 mplayerplug-in-wmp.xpt -> ../../mozilla/plugins/mplayerplug-in-wmp.xpt
lrwxrwxrwx 1 root root   40 2008-02-28 14:15 mplayerplug-in.xpt -> ../../mozilla/plugins/mplayerplug-in.xpt

Você deve criar esses mesmos links simbólicos no diretório plugins do Firefox 3:

cd /usr/lib/firefox-3.0/plugins/
sudo ln -s /etc/alternatives/firefox-flashplugin .
sudo ln -s /etc/alternatives/firefox-javaplugin.so .
sudo ln -s ../../totem/libtotem-* .
sudo ln -s ../../mozilla/plugins/mplayerplug-in* .

Finalmente, fiz um backup do diretório de configurações que fica no meu home:

cd ~
cp -r .mozilla FIREFOX-2.0_BACKUP

Pronto, o Firefox 3.0 já está instalado. Para retornar à versão 2, basta remover o link /usr/lib/firefox e criar outro apontando para firefox2.0:

cd /usr/lib
sudo rm firefox
sudo ln -s firefox-2.0 firefox

Ao executar a nova versão pela primeira vez, como em qualquer atualização, o Firefox verifica a compatibilidade das extensões que estão instaladas. Algumas extensões apareceram como não compatíveis com o Firefox 3. O Autocomplete Manager, por exemplo, é incompatível, mas foi incorporado ao Firefox 3 e não é mais necessário. Já o Firebug, ferramenta essencial para qualquer desenvolvedor web, tem duas versões: 1.05 para Firefox 2 e 1.2 para Firefox 3. Ao iniciar o Firefox 3 pela primeira vez, você receberá uma mensagem informando que o Firebug é incompatível, e que não foram encontradas versões mais recentes da extensão. Você deve procurá-lo na página de add-ons e clicar em “add to Firefox” para instalar a versão mais recente.

Referência: Instalando Firefox 3 no Centos/RHEL e Fedora


O Active Record é um dos principais componentes do Rails, pois é exatamente o model do MVC. Ele mapeia automaticamente uma classe numa tabela do banco de dados, criando métodos para acesso a cada atributo. Porém, e se quisermos desenvolver uma aplicação sem banco de dados?

Passei por esta situação recentemente: a aplicação acessa um servidor diretamente, via Atom, e, portanto, não precisa armazenar dados localmente. Porém, não basta comentar todas as linhas do arquivo config/database.yml, pois o Rails mostrará uma mensagem de erro informando que não encontrou o banco de dados correspondente.

Para resolver este problema, resolvi, inicialmente, tentar não utilizar o Active Record. Para isso, primeiramente precisei modificar o model que eu tinha na aplicação, retirando a herança de ActiveRecord::Base. Porém, ao tentar executar o servidor, recebi mensagens de erro informando que o banco de dados não foi encontrado. Isso ocorre porque, apesar de não haver qualquer classe herdando de ActiveRecord::Base no projeto, este módulo estava sendo carregado. Consequentemente, o Rails tentava ler o arquivo config/database.yml, que não estava configurado, resultando na mensagem de erro. Para evitar este problema, foi necessário evitar o carregamento do Active Record explicitamente, acrescentando a linha abaixo ao arquivo config/environment.rb:

config.frameworks -= [ :active_record ]

Feito isto, o Rails passa a funcionar sem banco de dados e sem Active Record. Porém, surgiu um outro problema: os testes unitários do Rails pararam de funcionar, pois a classe ActiveSupport::TestCase, que é a classe base para os testes unitários, não funciona sem Active Record. Para resolver, troquei a herança desta classe para Test::Unit::TestCase, que era utilizada como padrão antes da versão 2 do Rails. Não sei exatamente quais são as diferenças entre as duas, mas só consegui resolver este problema desta forma - se alguém descobrir alguma outra solução, me avise!

Também precisei carregar explicitamente o model no arquivo de teste, pois o Rails deixou de fazer a referência automática a esta classe. Feitas as alterações, o arquivo de teste (ex: test/unit/usuario_test.rb) ficou assim:

require 'test/test_helper'
require 'test/unit'
require 'app/models/usuario'

class UsuarioTest < Test::Unit::TestCase
  # Replace this with your real tests.
  def test_truth
    assert true
  end
end

O uso de IDEs para desenvolvimento em Rails é um assunto bastante controverso. Devido às diversas facilidades no desenvolvimento com este framework, muitas pessoas afirmam que uma IDE não é necessária, basta um editor de textos simples e um terminal. Outros acreditam que, apesar do alto grau de automação do Rails, ainda é vantajoso usar uma IDE. No meio desta discussão, acredito que, no caso do Ruby on Rails, a escolha torna-se um gosto pessoal.

Para os que estão no primeiro caso, a escolha do editor de texto também é uma questão de gosto pessoal. Alguns se sentem confortáveis com o vi, outros com o Emacs. Estes casos são mais comuns quando já há uma intimidade com estes editores - dificilmente alguém vai aprender a usar Emacs para desenvolver em Rails. Para quem prefere um editor mais amigável, há opções para todos os sistemas operacionais: no Linux, o Gedit, quando bem configurado com alguns dos diversos plugins disponíveis, torna-se uma poderosa ferramenta de desenvolvimento, com code completion, por exemplo. No Mac há o TextMate e no Windows o SciTe (também disponível para Linux). Para tarefas como rodar o servidor web, executar migrations e generates, debugar a aplicação ou trabalhar com uma ferramenta de controle de versão (CVS, SVN, GIT, etc), usa-se o terminal.

Para quem prefere usar uma IDE, a principal vantagem é não precisar recorrer ao terminal para executar as tarefas acima. Tudo é integrado, facilitando o trabalho. Realmente algumas dessas tarefas são extremamente simples, como executar migrations. Nestes casos, pouca diferença há entre usar a IDE ou o terminal. Porém, trabalhar com uma ferramenta de controle de versão e executar um debug por linha de comando pode ser trabalhoso. Acredito que estas sejam as principais vantagens de se usar uma IDE. Por outro lado, as IDEs requerem bastante memória do desktop, ao contrário dos editores de texto, e costumam ser mais instáveis.

As opções de IDE para Rails também são variadas, e as duas principais são o Aptana RadRails e o NetBeans. Nos últimos meses trabalhei com ambos alternadamente, e encontrei diversas vantagens e desvantagens em cada um.

Aptana RadRails

O Aptana RadRails pode ser instalado como um plugin do Eclipse ou isoladamente, caso você não o tenha instalado. Na primeira vez que o testei, há alguns meses, achei o plugin bastante instável, e com alguns bugs incômodos. Recentemente, ao verificar que havia uma nova versão disponível, testei novamente, e verifiquei que esta nova versão está bem melhor. Há alguns meses atrás, escrevi neste post que o RadRails não conseguia ler arquivos database.yml usando o formato descrito. Conforme este comentário do Chris Williams, um dos desenvolvedores do RadRails, a nova versão corrigiu este problema e outros que eu havia encontrado. A versão mais recente também possui um Ruby Shell bastante útil, inclusive com autocomplete de comandos e parâmetros, porém instável - já o vi travar algumas vezes. Outras vantagens do RadRails são:

  • Botões para acesso rápido ao Model, View, Controller, Helper e Test equivalentes ao arquivo ativo
  • Problema do DRY no database.yml corrigido
  • Suporte a testes mais completo (permite executar apenas um arquivo de testes de cada vez)

As principais desvantagens do RadRails são:

  • Problemas no autocomplete (não mostra todos os métodos)
  • O console não aceita a tecla para cima para acessar os últimos comandos, como no shell
  • Ruby shell instável (trava com frequência)
  • Server não permite selecionar um environment diferente dos 3 defaults (development, test e production), mesmo que você tenha algum outro environment definido no arquivo database.yml

NetBeans

O suporte do NetBeans ao Rails tornou-se estável há mais tempo que o RadRails, com um editor para código Ruby bem completo. Atualmente, ambos diferenciam-se nos detalhes. Principais vantagens do NetBeans:

  • Ao selecionar um texto e digitar (, o editor envolve o texto selecionado com parênteses
  • Ao selecionar um texto e digitar #, o editor envolve o texto selecionado com #{ e }
  • Ao colocar o cursor sobre um end, o editor destaca o inicio desse bloco/método/classe
  • O find é mais fácil de usar (estilo Firefox, com highlight automático dos termos conforme você digita)

Principais desvantagens do NetBeans:

  • Problemas no autocomplete (mostra os métodos que não deveriam aparecer)
  • O console não aceita a tecla para cima para acessar os últimos comandos, como no shell
  • Suporte a SVN bastante limitado
  • A execução do server não permite selecionar o environment (sempre utiliza o development)
  • A opção Test executa todos os testes (não há opção para executar apenas um arquivo, ou apenas os testes unitários, por exemplo)

Concluindo, o editor do NetBeans me parece mais completo para tratamento de código Ruby. Porém, o ambiente do RadRails é mais completo para execução de testes, integração com SVN e outras tarefas. Um ponto onde ambos apresentam problemas é o autocomplete - às vezes aparecem métodos de mais, outras vezes de menos. Porém, devemos reconhecer que, por se tratar de uma linguagem dinâmica, onde uma variável não tem tipo fixo, é bastante complicado termos um autocomplete realmente preciso.