Artigos com o marcador rails

Apostila de Ruby on Rails da Caelum liberada para download

No último dia 12/12/2009, a Caelum liberou gratuitamente a apostila utilizada por eles nos cursos de Ruby on Rails. Para quem está começando, vale muito a pena fazer o download para estudo.

Para fazer o download, clique aqui.

Link direto para o PDF aqui.

A apostila é muito completa. É abordado desde os conceitos básico da programação em Ruby até o uso de gems, plugins e AJAX no Rails. É um bom pontapé de início essa apostila.

Abaixo segue o índice da apostila para você ter uma noção do que irá encontrar.

1 Agilidade na Web 1
1.1 A agilidade
1.2 A comunidade Rails
1.3 Bibliografia
1.4 Tirando dúvidas
1.5 Para onde ir depois?
2 A linguagem Ruby 4
2.1 A história do Ruby
2.2 Características
2.3 Instalação do interpretador
2.4 Outras implementações
2.5 MagLev
2.6 Ruby Enterprise Edition
2.7 Interactive Ruby
2.8 Tipos Básicos
2.9 Para Saber Mais – Desafios
2.10 Para Saber Mais – Desafio

3 Ruby Avançado 12
3.1 Mundo orientado a objetos
3.2 Métodos comuns
3.3 Meta-programação
3.4 Definição de métodos
3.5 Discussão: Enviando mensagens aos objetos
3.6 Classes
3.7 Desafio: Classes abertas
3.8 self
3.9 Desafio: self e o método puts
3.10 Atributos e propriedades: acessores e modificadores
3.11 Syntax Sugar
3.12 Métodos de Classe
3.13 Para saber mais: Singleton Classes
3.14 Metaprogramação
3.15 Convenções
3.16 Coleções
3.17 Blocos e Programação Funcional
3.18 Desafio: Usando blocos
3.19 Mais OO
3.20 Modulos
3.21 Manipulando erros e exceptions
3.22 Exercício: Manipulando exceptions
3.23 Arquivos Ruby

4 Ruby on Rails 29
4.1 Ruby On Rails – Apresentação
4.2 Aprender Ruby?
4.3 RadRails 30
4.4 Primeira Aplicação
4.5 Exercícios: Iniciando o Projeto
4.6 Estrutura dos diretórios
4.7 O Banco de Dados
4.8 Exercícios: Criando o banco de dados
4.9 A base da construção: scaffold (andaime)
4.10 Exercícios: Scaffold
4.11 Gerar as tabelas
4.12 Versão do Banco de Dados
4.13 Exercícios: Migrar tabela
4.14 Server
4.15 Documentação do Rails
4.16 Exercício Opcional: Utilizando a documentação

5 Active Record
5.1 Motivação
5.2 Exercícios: Controle de Restaurantes
5.3 Modelo – O “M” do MVC
5.4 ActiveRecord
5.5 Rake
5.6 Criando Modelos
5.7 Migrations
5.8 Exercícios: Criando os modelos
5.9 Manipulando nossos modelos pelo console
5.10 Exercícios: Manipulando registros
5.11 Exercícios Opcionais
5.12 Finders
5.13 Exercícios: Buscas dinâmicas
5.14 Validações
5.15 Exercícios: Validações
5.16 Exercícios – Completando nosso modelo
5.17 O Modelo Qualificação
5.18 Exercícios – Criando o Modelo de Qualificação
5.19 Relacionamentos
5.20 Para Saber Mais: Cache
5.21 Exercícios – Relacionamentos
5.22 Para Saber Mais – Eager Loading
5.23 Para Saber Mais – Named Scopes
5.24 Para Saber Mais – Modules

6 Controllers e Views
6.1 O “V” e o “C” do MVC
6.2 Hello World
6.3 Exercícios: Criando o controlador
6.4 Redirecionamento de Action e Action padrão
6.5 Trabalhando com a View: O ERB
6.6 Entendendo melhor o CRUD
6.7 Exercícios: Controlador do Restaurante
6.8 Helper
6.9 Exercícios: Utilizando helpers para criar as views
6.10 Partial
6.11 Exercícios: Customizando o cabeçalho
6.12 Layout
6.13 Exercícios: Criando o header
6.14 Outras formas de gerar a View
6.15 Filtros

7 Rotas
7.1 routes.rb
7.2 Pretty URLs
7.3 Named Routes
7.4 REST – map.resource
7.5 Actions extras em Resources
7.6 Diversas Representações
7.7 Para Saber Mais – Nested Resources

8 Completando o Sistema
8.1 Exercícios
8.2 Selecionando Clientes e Restaurante no form de Qualificações
8.3 Exercícios
8.4 Exercícios Opcionais

9 Calculations
9.1 Método
9.2 Média
9.3 Exercícios

10 Associações Polimórficas
10.1 Nosso problema
10.2 Alterando o banco de dados
10.3 Exercícios

11 Ajax fácil com RJS
11.1 Adicionando comentários nas views
11.2 Métodos de RJS Templates
11.3 Exercícios
11.4 Adicionando comentários
11.5 Exercícios
11.6 Exercícios – Enviando os dados com Ajax

12 Alguns Plugins e Gems Importantes
12.1 Paginação
12.2 Exercícios – Título
12.3 Hpricot
12.4 Exercícios – Testando o Hpricot
12.5 File Uploads: Paperclip
12.6 Exercícios

13 Apêndice A – Testes 127
13.1 O Porquê dos testes?
13.2 Test::Unit
13.3 RSpec
13.4 Cucumber, o novo Story Runner

14 Apêndice B – Integrando Java e Ruby
14.1 O Projeto
14.2 Testando o JRuby
14.3 Exercícios
14.4 Testando o JRuby com Swing

15 Apêndice C – Deployment
15.1 Webrick
15.2 CGI
15.3 FCGI – FastCGI
15.4 Lighttpd e Litespeed
15.5 Mongrel
15.6 Proxies Reversos
15.7 Phusion Passenger (mod_rails)
15.8 Ruby Enterprise Edition
15.9 Exercícios: Deploy com Apache e Passenger

16 Apêndice D – Instalação
16.1 Ruby – Ubuntu
16.2 Ruby – Windows
16.3 Rails
16.4 JDK
16.5 Aptana
16.6 Mongrel
16.7 MySQL
16.8 SVN

  • Share/Bookmark

Problema do Rails 2.2.2 com o MySQL em Windows

Desde que a versão 2.2.2 do Rails foi lançada, alguns problemas relacionados ao driver do MySQL, que conectava a aplicação Rails ao banco, começaram a surgir e incharam lista de discussões com relatos de problemas. Um desses problemas era que quando vamos executar o rake db:migrate ocorre um erro que apresentava a seguinte mensagem:

!!! The bundled mysql.rb driver has been removed from Rails 2.2. 
Please install the mysql gem and try again: gem install mysql.
rake aborted!
126: The specified module could not be found.   - 
c:/ruby/lib/ruby/gems/1.8/gems/mysql-2.7.3-x86-mswin32/ext/mysql.so
 
(See full trace by running task with --trace)

Acredito que se você tem esse problema você já deva ter instalado o gem do MySQL e mesmo assim continuou tendo esse problema. Caso você não tenha instalado o gem, por favor faça:

gem install mysql --no-rdoc --no-ri

Feita a instalação, veja se na lista de gems instaladas, se encontra o MySQL. Para ver suas gems instaladas:

gem list --local

O gem do MySQL deverá estar instalado.

Bem, se você tentar rodar o migrate denovo, provavelmente terá o mesmo problema. Pesquisando pelas partes mais distantes da internet encontrei uma solução que dizia para copiar e colar o arquivo <MYSQL_HOME>/bin/libmysql.dll para pasta <RUBY_HOME>/bin. Mas isso tem um porém. Se sua versão do MySQL instalado for a 5.1 o problema continuará.

Você terá que copiar o libmysql.dll do MySQL 5.0. No link abaixo você poderá fazer o download da versão correta do libmysql.dll pra usar:

http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll

Copie o libmysql.dll do link acima para a pasta <RUBY_HOME>/bin. Feito isso, tente novamente executar o migrate e verás que agora funciona!

  • Share/Bookmark

Usando o Gmail para enviar e-mail com o ActionMailer no Rails

Existe uma maneira muito fácil de se enviar e-mails no Rails e usando o Gmail. Nesse pequeno tutorial tentarei explicar como fazer isso funcionar.

Primeiramente é preciso saber que o Gmail utiliza para autenticação de protocolo SMTP (envio de e-mails) o ssl/tls. Essa forma de autenticação não é suportada nativamente pelo ActionMailer. Isso quer dizer que precisaremos de uma ajudinha para podermos enviar e-mails utilizando o Rails e o Gmail.

Essa ajudinha é uma biblioteca que está voando pela Internet (eu não sei quem é o autor e muito menos da onde ela saiu) e nos ajudará com a autenticação. Eu tenho uma cópia dessa biblioteca em meu GitHub, você pode pegá-la aqui.

Com a biblioteca em mãos copie ela para a pasta lib do seu projeto Rails. Provavelmente ficará assim o caminho:

/lib/smtp_tls.rb

Agora abra o arquivo config/environment.rb e lá no fim, bem lá no fim mesmo, adicione o seguinte trecho de código:

ActionMailer::Base.default_content_type = "text/html"
ActionMailer::Base.smtp_settings = {
   :address =&gt; "smtp.gmail.com",
   :port =&gt; 587,
   :authentication =&gt; :plain,
   :user_name =&gt; "seuemail@gmail.com", #Você pode usar o Google Apps!
   :password =&gt; 'suasenha'
}

Bacana. Está tudo configurado. Agora vamos ver como se fazer no ActionMailer para se enviar um e-mail. Vamos gerar um novo Mailer. Em seu console digite:

ruby script/generate mailer Notificador

Seu novo mailer será gerado. Após a geração, abra ele (app/models/notificador.rb)

Adicione o seguinte método:

def notificar
     recipients "destinatario@email.com"
     from  "meumail@meuemail.com"
     subject "Titulo do Email"
end

Agora você precisa adicionar uma view com o mesmo nome desse método, assim como se faz com os Controllers. Nese caso, a vew ficaria views/teste/notificar.erb

Nesse arquivo ficará tudo o que você quer enviar ao destinatório. É o corpo do e-mail mesmo. Você pode utilizar variáveis de instância caso queira passar alguma informação para a view, da mesma forma que é feito nos controllers.

Criada a view, basta chamar o mailer nos controllerspara enviar o email da seguinte forma:

Notificador.deliver_notificar

Repare que é colocado um deliver_ ali antes do nome do método que setamos. Isso é normal.

Se tudo ocorrer bem seu e-mail será enviado. Porém enviando um e-mail dessa forma irá ter um tempo de request mais demorado.

  • Share/Bookmark

Obtendo Hash MD5 e SHA com Rails

Para se obter hashs tanto MD5 como SHA com Rails é muito fácil. Abaixo segue o que eu faço para calcular os Hashs:

def md5(str)
    return Digest::MD5.hexdigest(str)
end
 
def sha1(str)
    return Digest::SHA1.hexdigest(str)
end
 
def sha256(str)
    return Digest::SHA256.hexdigest(str)
end

Você pode ver no exemplo acima que coloquei três funções. Uma para MD5, outra para SHA1 e outra para SHA256. Mas existem outros ainda. Veja:

  1. Digest::SHA1.hexdigest() – Produz 40 caracteres de dígitos hexadecimais.
  2. Digest::SHA256.hexdigest() – Produz 64 caracteres de dígitos hexadecimais.
  3. Digest::SHA384.hexdigest() – Produz 96caracteres de dígitos hexadecimais.
  4. Digest::SHA512.hexdigest() – Produz 128 caracteres de dígitos hexadecimais.

Se quiser, você pode testar essas funções no console do Rils. Basta abrir o console:

ruby script/console

Digite o comando:

strHash = Digest::SHA1.hexdigest("string")

A saída deverá ser:

=> "ecb252044b5ea0f679ee78ec1a12904739e2904d"

Fácil e simples.

  • Share/Bookmark

Rails Summit – Algumas apresentações e Fotos

Até agora somente disponibilizaram duas apresentações feitas no Rails Summit Laton America 2008. Estou sempr vendo se os caras vão disponibilizar ou não as apresentações. Assim que eles disponibilizarem (se disponibilizarem), colocarei o link aqui no Blog.

Por enquanto somente essas duas apresentações sairam:

E você pode achar muitas fotos do evento fazendo essa busca no Flickr.

É isso. Assim que tivermos mais novidades, estarei postando!

  • Share/Bookmark

Rails Summit Latin America 2008 – Excelente

Evento totalmente excelente.

Para quem esteve no evento sabe o que eu estou falando. Foi um evento muito, mas muito bom mesmo. As palestras de ltíssimo nível, bem organizado, local be acessível para que vem de fora e ainda com as “locawebzetes”. Fábio Akita e o pessoal da organização realmente estão de parabéns.

Dia 1

Fábio Akita abriu o evento e passou a palavra para Gilberto Mautner que é co-fundador da Locaweb. Esse é o cara que trouxe o Ruby on Rails para a Locaweb. Na abertura, tivemos um vídeo onde os dois loucos do RailsEnvy mandaram uma mensagem para o Rails Summit Latin America 2008. Vocês podem ver o vídeo aqui: http://vimeo.com/1974744

Sobre as palestras, no primeiro dia tivemos excelentes palestras com Chad Fowler falando sobre como ser reconhecido e como ser “remarkable” (be remarkable) com o que você faz. Esse assunto tanto cabe em desenvolvimento como em qualquer outra área profissional.

David Heinemeir Hanson (D.H.H) respondeu dúvidas e questões do pessoal a respeito (logicamente) do Ruby on Rails. Foram abordadas questões sobre Thread Safety, Internacionalização, Release do Rails 2.2 (a qual ele não revelou) entre outras.

Sobre Rest tivemos uma palestra muito legal com George Malamidis e Danilo Sato, ambos da ThoughtWorks.

Assisti também a palestra de Carlos Brando e a experiência dele e da equipe brasileira trabalhando para a SurgeWorks. Foi abordado assuntos bem interessantes como a aplicação de métodos ágeis com equipes remotas.

Tivemos um keynote de Chris Wanstrath criador do repositório GitHub um dos mais acessados pela comunidade Rails. Ele contou sobre a trajetória de sua vida profissional até chegar no GitHub.

E para finalizar o primeiro dia tivemos uma “desconferência” (Birds of a Feather) onde quem quisesse subir no palanque para falar o que queria sobre Ruby/Rails ou relacionado podia. Uma momento muito bom de descontração mesmo.

Nesse primeiro dia não tive a oportunidade de assistir algumas palestras pois eram paralelas com outras. Assim não poderei falar muito sobre as palestras do Fábio Akita e Dr.Nic.

Dia 2

Já logo pela manhã começamos com a palestra dos carinhas (Ninh Bui e Hongli Lai) da Phusion. Essa palestra foi excelente. A apresentação dos caras é sensacional. Falaram sobre passenger, escalabilidade, distribuição de carga…

Depois por áudio conferência, tivemos uma apresentação de Charles Nutter e Thomas Enebo que são criadores mantenedores do JRuby. Fizerem demonstração incríveis e como é fácil rodar aplicações Swing com JRuby e também alguns benchmarks com JRuby.

Fiquei curioso sobre a palestra de George Guimarães que falou sobre deployments e configuração de ambiente de produção para aplicações Rails. Ele também abordou algumas dificuldades que tiveram na construção da StartUp Pagestacker.

Para mim, as melhores palestras vieram nesse momento. As palestras de David Chelimsky sobre RSpec e sobre o Cucumber foram excelentes. Explicou os conceitos do BDD (Behavior Driven Development) e do TDD (Test Drive Development) além de mostrar exemplos reais da utilização do RSpec e do Cucumber. Fiquei honrado de poder assitir a palestra do David e espero poder assistir muitas outras.

Danilo Sato voltou no dia 2 (mas agora sem falar inglês e sem o George Malamidis) e também fez uma ótima apresentação sobre testes automatizados. Mostrou exemplos e problemas enfrentados no dia a dia do desenvolvedor na hora de elaborar testes.

Fabio Kung também palestrou no evento falando sobre o uso de JRuby porém mais focado na VM Java do que no código Ruby propriamente dito. Apresentou vantagens sobre o uso do JRuby ao invés do interpretador do Matz e exemplificou isso no uso de memória, e threads.

E para finalizar o ciclo de palestras no segundo dia tivemos o keynote de Obie Fernandez que falou com é dia a dia no desenvolvimento dos projetos de sua empresa Hashrocket onde eles usam métodos ágeis e Rails. Mostrou o que deve ser feito e quais as atitude a serem tomadas para se ter sucesso no desenvolvimento com Rails. Essa também foi uma das melhores palestras do dia.

Assim como no primeiro dia não consegui assistir a todas as palestras do dia devido as sessões paralelas então acabei perdendo as palestras de Jay Fields, Manoel Lemos, Vinícius Teles, Phillippe Hanrigou e Luis Lavena.

Depois tivemos alguns sorteios dos patrocinadores (Intel, Sun, Accept, Info Exame, Linux Magazine…) e da Locaweb. Saí do evento por volta das 20:45 e fiquei totalmente satisfeito com o que vi e aprendi. Valeu muito a pena o investimento. Se eu fosse você já começava a me preparar para o Rails Summit Latin America 2009. Eu já estou me preparando.

Fotos

Aqui segue alguns materiais “coletados” pela Net. Como eu sou uma anta e esqueci de levar máquina fotográfica, pegarei emprestado os Flickrs de algumas pessoas que foram ao evento:

Assim que eu conseguir mais materiais legais do evento eu com certeza postarei. Muitos palestrantes irão disponibilizar suas apresentações na Web, assim que eu descobrir onde elas ficarão eu também postarei.

Veja também o LiveStream do BlogBlogs.

  • Share/Bookmark

Rails Summit Latin America

Fala galera! Já faz um tempinho que não posto pois o trabalho está corrido. Vamos ver se daqui para frente volto apostar com mais frequência, tá difícil, mas vou tentar!

Bom, volto com esse post para divulgar o maior evento sobre Ruby on rails da América Latina que vai acontecer aqui no Brsil. Em São Paulo. É o Rails Summit Latin America. O evento promete e os palestrantes são de altíssimo nível. Mas muito alto mesmo, o próprio DHH, criador do framework, irá palestrar.

No blog do Akita há muitas informações sobre o evento, veja mais detalhes aqui:

A Locaweb está partocinando o evento e você pode fazer sua inscrição aqui:

No mesmo site da inscrição contém os valores, os palestrantes, o local… Tudo sobre o evento.

Eu já fiz a minha incrição e estarei lá com certeza. Você já fez a sua?

  • Share/Bookmark

Lendo XML com o REXML – Ruby

Ruby tem hoje uma das bibliotecas mais impressionantes e fáceis para se manipular informações em formato XML. A biblioteca REXML (Ruby Electric XML).

Essa biblioteca é baseada na biblioteca Electric XML para Java, porém em Ruby é bem mais fácil de se usar tal biblioteca. Aliás, você não fica restrito apenas a manipulação de XML com o REXML, você também poderá usá-la para manipulação de informações no formato XHTML. Como o XHTML tem padrões rigorosos definidos, podemos usar o REXML tranqüilamente. Mas se você precisa manipular HTML, use o hpricot.

Nesse post, eu mostro o básico de uma leitura XML usando a REXML. Em nosso exemplo utilizaremos o webservice de pesquisa do Yahoo. Basicamente iremos ler o XML que o Yahoo nos fornece e iremos exibi-los em console.

Primeiro de tudo vamos ver qual a estrutura do XML que o Yahoo nos fornece para fazermos a leitura. A URL do XML é essa: http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=metallica&results=5

Repare na URL que eu passei acima as variáveis que passei via GET. Uma é a palavra chave de busca (query) e a outra o número de resultados que eu quero por página (results). Estão com os valores “metallica” e “5” respectivamente. Se quiser se aprofundar na API de busca do Yahoo, consulte o site do developers do Yahoo.

Voltando a XML fornecida pelo Yahoo, vamos analisa-la:

Estrutura básica do XML do Yahoo

Cada “caixa” em azul representa um nó no XML. Tudo começa com um nó raiz (ResultSet) e depois desce para o nó de resultado (Result). Esse nós repsenta um item do resultado da pesquisa feita no Yahoo. Se houve mais resultados, então o nó Result é repetido.

Em nosso tutorial, vamos ler as informações que estão nos nós “Title”, “Summary”, “Url” e “MimeType” que não se encontra no mapeamento acima porque não houve espaço para colocar todos os nós. De uma olhada no documento do Yahoo que você irá ver lá.

Agora que sabemos as informações que iremos ler, vamos começar a codificar.

Vamos criar uma classe “Buscador” que irá se conectar ao webservice do Yahoo, ler toda a XML e inicializar nossos atributos de instância no construtor. Depois criaremos um método que irá ler os nós  específicos do XML que queremos.

Comecemos pelos imports das bibliotecas e pelo construtor:

# Leitura de XML usando a biblioteca REXML
# do Ruby. Em nosso exemplo usaremos o
# webservice de busca do Yahoo.
 
class Buscador
 
   # Import dos GEMs usados e do REXML
   require 'rubygems'
   require 'open-uri'
   require 'rexml/document'
 
   #Vamos inicializar as variáveis para a busca e instanciar
   #nosso objeto REXML que será usado para a busca no Yahoo.
   def initialize(keywords, resultado_pagina)
      @keywords = keywords
      @resultado_pagina = resultado_pagina
      @url_yahoo = "http://api.search.yahoo.com/WebSearchService/V1/
webSearch?appid=YahooDemo&amp;query=#{@keywords}&amp;results=#{@resultado_pagina}"
 
      # Aqui você pode usar o open do gem open-uri ou
      # a classe net/http. O open é bem mais simples :).
      xml_data = open(@url_yahoo)
      @obj_rexml = REXML::Document.new(xml_data.read)
   end
end

Repare no código acima que nosso construtor recebe dois parâmetros. O keywords são as palavras chave que usaremos na busca e o resultado_pagina é o número de resultados que queremos que sejam exibidos no XML. Esse parâmetros são aqueles já explicados acima nesse mesmo post.

Outro detalhe no código é o uso do open. Nele, passamos somente a URL que queremos ler e ele nos retorna os dados com o método read. Incrível. Cada vez mais eu gosto de Ruby!

Logo abaixo do open, está a instanciação do objeto REXML, o qual usaremos para ler o XML no método que criaremos.

Criado o construtor, vamos criar nosso pequeno método que faz a leitura do XML e nos retorna o resultado.

A cada resultado que o Yahoo nos retornar, iremos criar um hash para esse resultado. Preenchido o hash com as informações do XML colocaremos esse hash dentro de um array. Faremos isso até finalizar a leitura do XML. Terminada a leitura, retornaremos o array. Nossos resultados estarão bem estruturados dentro do array.

Vamos ao método da busca:

   # Esse método realiza a leitura do xml e retorna um array de hash
   # com o resultado da leitura.
   def buscar
      lista_resultado = Array.new #array com todos os resultados
 
      # Caminho dos nos no XML. Dependendo do que você quiser
      # no XML, vai ser aqui você irá muda.
      nos = "ResultSet/Result"
 
      # Loop entre os nos do XML definido acima
      @obj_rexml.elements.each(nos) do |elemento|
         resultado = Hash.new #hash que vai conter um resultado
 
         resultado[:titulo] = elemento.text("Title")
         resultado[:descricao] = elemento.text("Summary")
         resultado[:link] = elemento.text("Url")
         resultado[:tipo] = elemento.text("MimeType")
 
         # Guarda o hash no array e continua o loop
         lista_resultado < < resultado
      end
 
      # Retorna o Array com os resultados
      return lista_resultado
   end

Explicando o que se passa nesse método:

  • lista_resultado: Nosso array onde ficarão os hash de cada resultado individual.
  • nos: é o “caminho” no XML que queremos. Tudo o que estiver dentro desse caminho, ele irá nos retornar.
  • @obj_rexml.elements.each(nos) do |elemento|: Loop entre os nós dentro do caminho passado.
  • resultado: Hash que representa um resultado individual.
  • resultado[:titulo] = elemento.text(“Title”): Inserção no Hash (posição :title) o elemento XML que contém um nó chamado “Title”.
  • lista_resultado << resultado: Insere o hash no array
  • return lista_resultado: Retorna o array com os resultados!

O método .text(nó) chamado pelo objeto elemento significa que queremos o texto que está dentro do nó passado como parâmetro. Quando há um atributo no nó, podemos utilizar o método .attributte(atributo). Por exemplo, supondo que um nó possua um atributo “id=5” da seguinte forma: <title id=”5”>Texto do Título</title>. Então poderíamos utilizar o método assim:

elemento.attributte(“id”)
=> 5

Bem legal!

Pronto! Muito simples. Nossa classe está pronta. No final das contas teremos o seguinte código:

class Buscador
 
   require 'rubygems'
   require 'open-uri'
   require 'rexml/document'
 
   def initialize(keywords, resultado_pagina)
      @keywords = keywords
      @resultado_pagina = resultado_pagina
      @url_yahoo = "http://api.search.yahoo.com/WebSearchService/V1/
webSearch?appid=YahooDemo&amp;query=#{@keywords}&amp;results=#{@resultado_pagina}"
 
      xml_data = open(@url_yahoo)
      @obj_rexml = REXML::Document.new(xml_data.read)
   end
 
   def buscar
      lista_resultado = Array.new #array com todos os resultados
 
      nos = "ResultSet/Result"
 
      @obj_rexml.elements.each(nos) do |elemento|
         resultado = Hash.new #hash que vai conter um resultado
 
         resultado[:titulo] = elemento.text("Title")
         resultado[:descricao] = elemento.text("Summary")
         resultado[:link] = elemento.text("Url")
         resultado[:tipo] = elemento.text("MimeType")
 
         lista_resultado < < resultado
      end
 
      return lista_resultado
   end
 
end

Para testarmos a classe recém-criada, você pode implementar o seguinte script logo após o fechamento da classe:

# Configurações do script
# As configurações abaixo são configurações básicas para uso no
# webservie do Yahoo.
keywords = "metallica+one"
resultados_por_pagina = 10
 
busca = Buscador.new(keywords, resultados_por_pagina)
resultados = busca.buscar
 
resultados.each do |item_achado|
   puts "Titulo: #{item_achado[:titulo]}"
   puts "Descricao: #{item_achado[:descricao]}"
   puts "Link: #{item_achado[:link]}"
   puts "Tipo: #{item_achado[:tipo]}"
   puts "-------------------------------------"
end

Executando o nosso exemplo teremos os seguintes exemplos de resultados:

Titulo: One (Metallica song) - Wikipedia, the free encyclopedia
Descricao: Metallica won their first Grammy Award in 1990 for "One", winning Best Metal ... "One" was written in November 1987 by Metallica's principal composers — rhythm ...
Link: http://en.wikipedia.org/wiki/One_(Metallica_song)
Tipo: text/html
-------------------------------------
Titulo: YouTube - Metallica - One
Descricao: Video of One by MetallicAMovie: Johnny Got His Gun ... one of the best songs by MetallicA. kingxwrong (2 hours ago) Show Hide +1. Marked as spam ...
Link: http://www.youtube.com/watch?v=-j39ABZyzek
Tipo: text/html
-------------------------------------
Titulo: YouTube - Metallica- One
Descricao: Metallica's music video "One" ... One - Metallica (Live 1989) 07:00 From: metallicafx. Views: 2,551,898. Loading...
Link: http://www.youtube.com/watch?v=JwW9L_qzqp8
Tipo: text/html

Com esse simples (bem simples mesmo) exemplo que criamos, mostramos a força do REXML. Usando o próprio Yahoo, podemos criar nosso próprio search engine com o Rails baseado no motor de busca do Yahoo. Por que não? Afinal as possibilidade são infinitas.

Se quiser se aprender mais sobre a manipulação de REXML segue alguns links:

É isso pessoal. Espero que tenham gostado do REXML assim como eu e até o próximo post!

  • Share/Bookmark