Ruby on Rails

Experiências na instalação do ambiente Ruby 1.8.7 on Rails 2.3.6

A configuração deste ambiente foi motivada por se tratar de um ambiente bem parecido com o de uma hospedagem de contratei esses dias no site5.com. Lá eles não tem a versão mais nova do Ruby (1.9.3), e não instalaram ainda por diversos motivos. A principal vantagem é que eles permitem a configuração do Rails 3. E esse era o meu interesse.

Este post tem por objetivo principal mostrar os passos necessários para instalar no Windows 7 32 bits o seguinte ambiente de desenvolvimento:

  • Ruby 1.8.7
  • Rails 2.3.6
  • Mysql Server Community 5.5.25

Comecei assim.

  1. Instalei o Ruby 1.8.7

  2. Instalei o DevKit

  3. Instalei o Rails

    • Abrir o prompt de comando (cmd)
    • Digitar o comando de instalação: gem install rails
  4. Instalei o MySql Community

  5. Instalei a libmysql.dll

    • Baixar o conector neste link: mysql-connector-c-noinstall-6.0.2-win32.zip
    • Extrair os arquivos para uma pasta qualquer: C:\MySqlConnector\ (Sugestão minha)
    • Copiar o arquivo C:\MySqlConnector\lib\libmysql.dll na pasta C:\Ruby187\bin\
  6. Criei o projeto

    • Abrir o prompt de comando
    • Criar a pasta: C:\sites\
    • Navergar até esta página com o seguinte comando: cd C:\sites\
    • Criar o projeto: rails new nome_do_seu_site -d mysql
    • Aguardar a finalização do processo
  7. Configurei os parâmetros de banco de dados

    • Usar as informações desta página para criar um usuário e garantir os privilégios dele
    • Abrir o arquivo: C:\sites\nome_do_seu_site\config\database.yml
    • Informar  usuário e senha
    • Configurar a porta de acesso (port: 3306)
    • Salvar e sair
  8. Configurei o arquivo hosts do Windows

    • Executar o notepad como administrador
    • Abrir o arquivo C:\Windows\System32\drivers\etc\hosts
    • Retirar o # (comentário) da linha: # 127.0.0.1    localhost
    • Salvar e sair
  9. Executar o seu projeto

    • Ser feliz! 😀

Principais problemas enfrentados

SyntaxError on the welcome to rails screen using Pow

  • Causa: Executei o comando (6) de criação da aplicação quando a versão do Ruby instalada era 1.9.3.
  • Solução: Desinstalar todas as versões do Ruby, instalar a versão correta, indicada na seção (1), e por fim, criar um novo projeto.

mysql2 gem compiled for wrong mysql client library

  • Causa: Usei a biblioteca libmysql.dll disponível no site Dll-files.com que está numa versão diferente da exigida pela gem mysql2 do Ruby.
  • Solução: Substitui o arquivo libmysql.dll pela versão oficial, disponível do site do MySql. Para fazer isso, basta executar o passo 5.

Can’t connect to MySQL server on ‘localhost’ (10061) (Mysql2::Error)

  • Causa: A aplicação não consegue encontrar o endereço localhost para se conectar ao banco de dados.
  • Solução: Editar o arquivo hosts e retorar o comentário da linha: # 127.0.0.1   localhost. Para fazer isso, basta executar o passo 8.

Diferenças entre Gems e RubyGems

O Ruby também tem algo que o torna muito interessante. Este algo se chama RubyGems. Na verdade este é um módulo do Ruby que permite acessar um repositório de bibliotecas para o Ruby, as famosas Gems. Cuidado! Não confunda o RubyGems com as Gems.

  • RubyGems: Módulo para acesso ao repositório de bibliotecas através de comandos no terminal/prompt
  • Gems: Bibliotecas escritas em Ruby e armazenadas no servidor, que podem ser acessadas através dos comandos do RubyGems.

Para quem teve a oportunidades de conhecer o mecanismo de instalação de aplicativos do linux, especialmente no Ubuntu, sabe como é prático. O RubyGems possui um mecanismo muito parecido com o famoso apt-get do Linux. Em outros post detalharei melhor o funcionamento destes comandos.

Instalação do Ruby no Linux (Ubuntu)

A instalação do Ruby no Linux é muito parecida com a instalação no Windows. A maior diferença é que você só precisa de alguns comandos no terminal e ele se encarrega de todo o resto (baixar e instalar no devido lugar).

$ sudo apt-get install ruby1.9.1-full

Pronto, Ruby instalado. Agora você pode fazer um teste rápido. Digite no terminal:

$ ruby -v
Primeira Aplicação Ruby no Linux

Você já deve saber que escrever um “Hello World” em Ruby é muito simples. Então vamos fazer um programa executá-lo. Para fazer isso iremos precisar de um editor de texto simples(Gedit, por exemplo) e o terminal para digitar alguns comandos. Agora vamos aos passos:

  • Abra o terminal (console) e vamos criar uma pasta para guardar o nosso programa, da seguinte forma:
$ cd ~
$ mkdir testeruby
$ cd testeruby
  • Abra o Gedit ou outro editor de sua preferência, escreva o texto abaixo:
puts "Hello world Ruby!"
  • Salve com o nome programa.rb na seguinte pasta: ~/testeruby
  • Volte para o terminal e execute o seu programa
$ ruby programa.rb

Se você fez tudo certinho verá o texto “Hello world Ruby!” sendo exibido no terminal (console).

Quando se usa o Linux, existem duas formas de você executar seus programas utilizando o Ruby. A primeira forma é utilizando o comando ruby + nome-do-arquivo.rb no terminal, como no exemplo anterior. A outra forma, é colocar o caminho para o interpretador Ruby dentro do arquivo programa.rb como no texto abaixo:

#!/usr/bin/env ruby
puts "Hello world Ruby!"

Agora dê permissão de execução para o seu arquivo:

$ chmod +x programa.rb

E execute-o:

$ ./programa.rb

Perceba que a diferença entre as duas formas de execução de programas Ruby é apenas o comando no terminal. Na primeira forma você usa o comando “ruby” e na segunda você o executa como um arquivo qualquer do linux.

Pronto, programa escrito e executando! E agora, está pronto para outros desafios?

Instalação do Ruby no Windows

Ruby é uma linguagem fácil de aprender. As tarefas diárias são simples de codificar, manter e incrementar. Quando você se depara com problemas aparentemente difíceis, acaba por resolvê-las de forma muito mais simples do que você imaginava. Ruby segue o princípio da menor surpresa – as coisas funcionam da forma como você espera, com poucas exceções. Isso realmente faz a diferença quando está programando. (The Pragmatic Programmer’s Guide)

Para que você consiga desenvolver utilizando a linguagem de programação Ruby, é necessária a instalação dos componentes básicos para que a linguagem seja entendida pelo seu computador. Neste caso, o interpretador e o gerenciador de pacotes são suficientes.

Instalando o Interpretador

Estou considerando que você não tenha nenhuma versão do Ruby instalada no seu computador. Caso tenha, é importante você observar a versão atualmente instalada (digite o comando: ruby -v no prompt de comando). Quando escrevi este post, a mais nova versão do Ruby era a 1.9.2 (recomendo). Se você tiver problemas ao instalar ou executar seus programas, você pode desinstalar a versão anterior ou usar o Pik para gerenciar as versões do Ruby já instaladas. Agora, vamos à parte mais interessante, acesse o site, baixe e instale o interpretador do Ruby (Windows installer) observando as versões recomendadas.

Instalando o Gerenciador de Pacotes (Gem)

Em seguida baixe a mais nova versão do RubyGems. Após fazer o download do RubyGems, você deverá descompactar em qualquer pasta do seu computador. Abra o prompt de comando, navegue até a pasta onde o RubyGems foi descompactado e instale com o comando:  ruby setup.rb

  • Fiz o download do arquivo rubygems-1.8.5 na pasta C:\Downloads
  • Descompactei
  • Entrei no prompt de comando e naveguei até a pasta: C:\Downloads\rubygems-2.8.5 como na imagem

Agora é só aguardar o final da instalação e você já terá o Ruby e o RubyGems instalado e pronto pra usar. Se quiser conferir qual a versão instalada atualmente é só digitar ruby –v ou gem –v no prompt de comando. Agora você tem comandos para executar seus programas em Ruby e instalar novas bibliotecas usando o gerenciador de pacotes (gem). Se quiser fazer um teste agora:

  • Abra o bloco de notas
  • escreva: puts “Hello world Ruby!”
  • Salve no C:\ com o nome: programa.rb
  • Vá para o prompt de comando
  • Digite ruby C:\programa.rb
  • Será exibido: Hello world Ruby!

Pronto, você já escreveu e executou seu primeiro programa em Ruby.

Rake task personalizado

Um dia precisei criar uma rake task para automatizar a importação de arquivos CSV em uma aplicação em RubyOnRails (2.3.8), então resolvi criar este post para ajudar a pessoas com o mesmo objetivo e que procuram criar rake tasks personalizadas.

A estrutura apresentada no código abaixo apresenta um exemplo de importação de um arquivo CSV de funcionários, que contém 3 campos:

  • nome – string
  • salário – float
  • cpf – string

Antes de continuar, explicarei rapidamente sobre os arquivos CSV. Arquivos CSV (comma-separated values) são arquivos de dados que guardam valores separados por vírgula. Assim a linha abaixo é um exemplo válido de uma linha do arquivo de funcionários.

"Fulano de tal",123.45,"987.654.321-00"

Pronto, agora você já sabe o que é um arquivo CSV e qual a estrutura do arquivo que será importado pela nossa rake task personalizada. Só lembrando que o script foi feito para rodar na versão 2.3.8 do Rails, mas não está limitado a ele, você pode usar em versões mais atuais, com as devidas adaptações, caso necessite.

# DATA: 10/06/2011
# PROGRAMADOR: Valberto Carneiro
# OBJETIVO: Criar um script para atualizacao dos salarios dos funcionarios e
#           criacao de novos salarios, caso a matricula do funcionario ainda
#           nao exista na base de dados.
# CONSIDERAÇÕES:
#   1. Aplicação em Rails (>= 2.3.8)
#   2. Conexão com banco de dados configurada
#   3. Tabela "funcionarios" criada e populada
#   4. Campos da tabela: id:integer, nome:string, salario:float, cpf:string

# app/models/funcionario.rb

class Funcionario < ActiveRecord::Base
# os metodos de acesso sao criados automaticamente pelo ActiveRecord
end

# lib/tasks/minhas_tarefas.rake

require 'csv'

namespace :tarefas do

  desc "Importa arquivo CSV, Parametro: PATH=/caminho/completo/para/o/arquivo.csv"

  task :importar_funcionarios => :environment do
    csv_file = ENV["PATH"]

    puts "Verificando a existência do arquivo..."

    unless File::exists?(csv_file)
      puts "Arquivo nao encontrado, verifique se esta correto e tente novamente."
      return
    end

    puts "Arquivo encontrado!"
    puts "Executando importacao, aguarde..."

    CSV.open("#{csv_file}","r") do |linha|
      nome    = linha[0]
      salario = linha[1]
      cpf     = linha[2]

      funcionario =  Funcionario.find_by_cpf(cpf)

      if funcionario
        funcionario.salario = salario
      else
        funcionario = Pessoa.new(:nome => nome, :salario => salario)
        funcionario.save
      end
    end
    puts "Importacao concluida com sucesso!"
  end
end

Ruby Ordenando Hash

Abra o console do Linux ou Windows e digite:

$ irb
> meuhash = {1=>"um", 3=>"tres", 2=>"dois"}
=> {1=>"um", 2=>"dois", 3=>"tres"}

Para ordenar um hash em ruby você só precisa chamar o método sort

> meuhash.sort
=> [[1, "um"], [2, "dois"], [3, "tres"]]

Porém o ruby não possui o método reverse para o hash, assim como existe em um array. Veja como fazer um reverse no seu hash.

> meuhash.sort {|a,b| -1*(a<=>b) }
=> [[3, "tres"], [2, "dois"], [1, "um"]]