Um pouco de Ruby e Rails
Olá pessoal, meu nome é Vinícius Luiz e essa é minha primeira participação dentro da comunidade Ruby. Resolvi montar esse material por que é a forma que tenho de fixar melhor o que to aprendendo. Comecei a poucos o estudo de Ruby e de Rails, esse pouco gostaria de compartilhar com mais alguém então por que não com todos? Nesse artigo não vou me aprofundar em uma aplicação Rails até por que não disponho de tanto conhecimento assim. Vou falar um pouco sobre RoR, sua instalação, atualização e, logicamente, falarei um pouco sobre Ruby (nessa ordem). Serei bastante direto e meus exemplos serão para Windows e Linux, por isso.
O que é RoR?
RoR é um acrônimo para RubyOnRails, ta certo?. Esse, na realidade, é um poderoso framework open-source de desenvolvimento web criado para construir, de forma muito rápida, aplicações web de alta qualidade. É bastante simples de instalar, seu único pré-requisito é o próprio Ruby instalado e configurado na máquina local, ai o resto é resto.
Como disse, o RoR precisa do Ruby por isso, pra inicio de conversa vamos instalar o Ruby que é uma linguagem de programação assim como java, dotnet, python, etc… Se você for usuário Microsoft, abaixo tem um link pra baixar um instalador da linguagem Ruby, o one-click install, no windows. Nele não existe segredo, é só ir pressionando próximo até aparece o fechar e pronto “Ruby funcionando!”.
http://rubyinstaller.rubyforge.org/wiki/wiki.pl
Para facilitar o entendimento desse micro-artigo, vou trabalhar com o windows XP e a distribuição Ubuntu do Linux. Os exemplos serão mostrados em ambos os sistemas operacionais, até por que uso ambos.
Continuando, pra quem usa linux a instalação do Ruby é meio diferente, mesmo assim, sem mistério. Como disse, eu uso Ubuntu, mas acredito que seja o mesmo para as demais distribuições por isso, faça o seguinte. Abra um terminal e digite:
sudo apt-get install ruby
Esse comando instala e configura o Ruby como se fosse o one-click install do windows, muito fácil ne mesmo?.
Agora que temos o Ruby instalado, basta fazer o mesmo com o Rails por isso vamos da seguinte maneira. Novamente, será exibido os passos para Ubuntu e posteriormente Windows, digite no terminal os comandos seguintes:
[Linux Ubuntu]
sudo gem install rails -y
sudo gem install sqlite3-ruby
sudo apt-get install libopenssl-ruby1.8
[Windows XP]
gem install rails -y
gem install sqlite3-ruby
Aguarde um tempinho (não se preocupe caso aparente que o comando não respondeu ou esta demorando um pouco, o sistema esta catalogando todas as dependências necessárias para o download, terminando, será exibidos a listagem com o que ta sendo instalado) e pronto. Muito complicado né mesmo? O primeiro comando instala o RoR com todas as suas dependências (pra isso o –y, em futuras versões do Ruby esse parâmetro não será necessário). O segundo comando instala um adaptador que vai possibilitar nossa aplicação conversar com um banco sqlite3 (é possível baixar o adaptador sem o banco está instalado, mas o sistema só vai rodar se encontrar o banco por isso instale-o também). O último comando só vale pra Linux, ele vai instalar a biblioteca openssl usada pelo mongrel para iniciar o serviço, quando não tem, da pau.
DICA: Se você usa proxy pra acessar a internet, no Windows precisa configurar uma variável para que o RubyGems possa baixar as gems. Faça o seguinte:
a) acesse as propriedades de meu computador;
b) depois avançado>variáveis de ambiente;
c) nela você vai criar uma variável chamada HTTP_PROXY e o valor dela devera ser http://<ip_proxy>:<porta_proxy>
d) abra novamente o terminal para que a modificação tenha efeito e pronto.
Continuando, vamos testar nosso ambiente. Uma forma bastante simples e pratica de fazer isso, por sinal muito parecida com a do java (javac), é digitando no terminal:
ruby -v
rails -v
Tanto pra Windows quanto Linux. O primeiro comando informa a versão do Ruby que esta instalada. O segundo informa a versão do Rails que foi baixada. Os dois comandos respondendo direitinho prova que ta tudo certinho com nossos passos até então (qual quer problema reveja os passos novamente).
Bom, como já temos os dois prontos, podemos fazer um teste mais rigoroso criando uma aplicação de demonstração para ver a coisa no vera mesmo.
Criando um Demo em Rails
Antes de tudo, você que usa Windows precisa realizar mais um passo chato configurando o Ruby na variável Path do sistema. Acesse as propriedades de Meu Computador, avançado>variáveis de ambiente e acrescente a seguinte instrução dentro da variável path.
C:\ruby\bin
O endereço tem de ser o da instalação do Ruby, coloque a unidade C: por que é o padrão da instalação. Após isso, feche o terminal para que ele re-carregue todas as configurações e pronto.
Crie em algum lugar uma pasta para centralizar seus projetos (isso não é um pré-requisito, mas deixa seu ambiente de trabalho mais organizado). Abra novamente o terminal de comandos (se você ainda estiver com o terminal anterior aberto, poderá usá-lo), por ele acesse a pasta de projetos Rails recém criada e digite:
rails Demo
Rails é o comando que vai criar sua aplicação, ele pede somente um parâmetro que é justo o nome do aplicativo. Esse comando instrui o Rails a criar um sistema web, note que ele não cria uma estrutura vazia. Isso acontece por que Rails segue uma serie de convenções para facilitar a vida de quem vai produzir sistemas. Uma dessas convenções é justamente a padronização do ambiente da aplicação por pastas especificas que ele próprio (RoR) se encarrega de gerenciar. Logicamente, você tem livre arbítrio para seguir suas próprias convenções e não as dele (RoR), só fique ciente que esse será um trabalho a mais que terá e você precisara gerenciar isso. Agora podemos acessar o demo e iniciar nosso primeiro sistema web digitando (a partir da pasta do projeto):
[Linux Ubuntu]
script/server
[Windows XP]
ruby script/server
Note que em um ambiente Windows, precisamos referenciar a variável de sistema Ruby. Agora vamos aponte o browse para o seguinte endereço:
http://localhost:3000
Se tudo correr direitinho, será exibido a pagina de boas vindas do projeto.
Como faço para atualizar meus projetos RoR?
Em vista de tudo pronto e funcionando, é bastante comum que você (programador) queira sempre esta com a versão mais atual de seu framework preferido. Com RoR não é diferente, mas existe uma condição para que isso ocorra. Alguns recursos do Ruby precisam se encontrar atualizados, por exemplo, RoR é instalado a partir de um gerenciador de pacotes do Ruby chamado RubyGems, ele se encarrega de verificar e baixar todas as dependências do RoR incluindo RDoc e, por ai vai. RubyGems é um recurso do Ruby muito usado, por isso sempre é bom da uma atualizada nele até por que versões mais recentes dos pacotes gems sempre irão pedir a versão mais atual do RubyGems e isso inclui RoR. A boa notícia é que fica fácil atualizar seus recursos depois RubyGems está pronto pra isso, basta certificar-se de que o sistema será atualizado corretamente a partir dos comandos:
[Linux Ubuntu]
sudo gem update –system
sudo gem install rails
sudo gem update rake
sudo gem update sqlite3-ruby
[Windwos XP]
gem update –system
gem install rails
gem update rake
gem update sqlite3-ruby
Novamente, tanto Linux quanto Windows. O primeiro comando atualiza o próprio sistema RubyGems (que é exigido pela versão mais recente do RoR) como já mencionado. O segundo comando instala Rails mais recente com todos os novos recursos. O terceiro comando atualiza a ferramenta Rake (um construtor de aplicações Ruby similar ao make do Linux). Por fim, o último comando vai atualizar o adaptador sqlite3 que foi instalado (você pode ter vários adaptadores, um para cada banco preferido seu).
Novamente, a execução dos comandos pode levar um tempinho para ser concluído, não se preocupe caso não aparece nenhum texto de imediato. Quando estiver finalizado, você poderá listar todas as gems instaladas usando o comando:
gem list
Esse é um comando do Ruby por isso pode ser rodado a qualquer instante. Existe um outro que possibilita você ler a documentação de todas as gems instaladas:
gem server
Executando essa instrução acima, você estará iniciando um servidor web na porta 8808 que dará acesso à documentação das gems de instaladas. Você verá uma lista des gems com links para o RDoc web e uma breve descrição da gem. O endereço para o server é:
http://localhost:8808/
Depois que estiver com a versão mais recente de RoR, pode acontecer que algumas de suas aplicações não funcionem. Esse é um problema muito simples de resolver por tanto faça o seguinte:
a) Acesse a arquivo config/environment.rb de sua aplicação;
b) Altera o valor da variável RAILS_GEM_VERSION para a nova versão do RoR que você quer usar, tipo: de RAILS_GEM_VERSION = ‘2.0.0′ para RAILS_GEM_VERSION = ‘2.1.2’.
O Ruby!
Até esse momento vimos um pouco sobre RoR. Nada muito detalhado, mas com algumas informações fundamentas pra quem ta iniciando. RubyOnRails é um Framework muito poderoso que não seria capaz de fazer o que faz se não fosse a linguagem de programação Ruby. Ruby é uma linguagem tão boa que hoje já temos empresas grandes como a Sun investindo nela. Existe até um projeto pouco conhecido chamado JRuby (eu disse pouco?) que vem tomando espaço de uns outros menos barulhentos mas muito legais como o Groovy (pra quem quiser saber mais, abaixo segue um post com 33 pontos de comparação para essas linguagens), detalhe, não estamos aqui para falar disso por isso deixaremos esses discurções para quem sabe mais do assunto por tanto.
http://www.javafree.org/news/view.jf?idNew=3118
Quando instalamos o Ruby no computador para testar o RoR, junto com ele foi instalado um programinha muito bom para se testar código, o irb (interactive Ruby shell), que nos possibilita chama-lo e já ir colocando códigos e testando. Nada muito complexo, excelente pra quem ta iniciando assim como eu. Agora, antes de tudo, vamos fazer algumas modificações no ambiente para facilitar e dar um pouco mais de agilidade as nossas vidas (essa configuração só se aplica ao Linux pos não sei como fazer isso no Windows, mas quem souber e quiser contribuir, sinta-se a vontade para postar aqui).
Acesse o diretório de seu usuário na pasta /home/, por exemplo:
/home/vinicius/
Dentro digite:
sudo gedit .irbrc
Será exibido um documento em branco, nele acrescente a linha:
require ‘irb/completion’
Ok, a partir de agora seu irb possui suporte para auto-complemento usando a tecla de atalho tab, mas isso ainda não esta funcionando pos falta um passo a ser seguido. Procure a pasta onde o Ruby foi instalando, no meu pc ela fica em /etc/lib/ruby. Pelo terminal, a partir dela faço o seguinte, localizo a pasta 1.8.2 que possui os arquivos rb depois digito o comando:
Rdoc *.rb
Esse comando vai gera a documentação do Core do Ruby a partir dos arquivos rb. Após essa trabalheira toda, agora sim poderemos utilizar o irb com recursos de auto-complemento. Vamos fazer só um teste rápido pra validar o que fizemos, acesse o terminal e digite:
irb
String.<PRECIONE_TAB>
A instruição irb vai iniciar a execução do programa IRB. Quando, nele, digitamos o nome de uma classe do Ruby e chamamos o método methods da classe, é exibo um array contendo todos os métodos dessa classe. Se os passos feitos antes do inicio do irb funcionaram, nós poderemos escrever, por exemplo, o nome de uma classe qualquer mais o ponto e pressione o TAB duas vezes (bem como o exemplo acima) que os métodos serão exibidos lado a lado na tela.
Beleza, tudo certo para nosso pequeno Tour? Vamos esquecer um pouquinho o que vimos em RoR e nos focarmos no Ruby por isso, antes de mais nada, é preciso entender que em Ruby tudo é um objeto e quando eu falo tudo me refiro a tudo mesmo (ta bom, tem algumas exceções que fogem a regra tipo variável, mixin e blocos) por isso, qualquer coisa que se faça esta sendo feito em um objeto. Por exemplo, vamos criar um método e uma classe, hum!! Como criar um método e uma classe?
Como disse, o IRB é um ambiente de teste que possibilita testar tudo o que vem na cabeça por isso uma definição de método tipo:
def meu_nome
puts “vinicius luiz”
end
ou uma declaração de classe tipo:
class Teste1
end
São coisas totalmente aceitas dentro dele. Não se preocupe em “onde que ele ta pondo essas coisas” ou “quando vai precisar compilar”. Ruby é uma linguagem totalmente dinâmica por isso o que você escrever no IRB já estará pronto para uso.
Agora que temos uma definição de método e uma declaração de classe, vamos ilustrar so mais um pouquinho e não se preocupe se o que vir for meio estranho. Como disse, em Ruby tudo é muito simples inclusive declarações de classe. Class em si é um objeto por isso podemos criar outras classes da seguinte maneira (esse é um modo muito diferente do convencional):
Teste2 = Class.new
Isso não é um bicho de sete cabeças pra se entender correto? O que fizemos foi simplesmente criar uma classe nova instanciando ela do objeto Class, simples não?
Agora, temos um método que vai imprimir uma string “vinicius luiz” quando for chamado no irb. Como o irb e um objeto Object, o que estamos fazendo na realidade é uma chamada em Object, exemplo (agora segue uma lista):
meu_nome
self.meu_nome
Object.meu_nome
Note a primeira chamada não é mais segredo já a segunda e a terceira! Como você percebeu, o método criado na realidade foi enfiado (sutil não?) no objeto Object e como IRB herda Object, também acessa esse mesmo método novo. Até o momento não vimos nada complicado, mas temos uma terceira forma de se chamar essa mesma função, digite:
Kernel.meu_nome
Kernel? Mas quem e esse Kernel afinal? Calma, eu explico! Kernel é um modulo que pega os dados postos no IRB e coloca em Object. Qualquer método que esteja sendo criado no IRB (na realidade em qualquer lugar no ruby) ficara acessível através do contexto de qualquer classe, do Kernel ou de Object, deu pra entender isso? Humm, pêra ae! Eu disse qualquer classe?
Ta lembrado das classes criadas no inicio, agora é à hora de usá-las, vamos fazer o seguinte:
Teste1.meu_nome
Teste2.meu_nome
Antes de prosseguir, permita me fazer uma pergunta. “Quem nasceu primeiro, o ovo ou a galinha?”, ehhh, to brincando. Bom, continuando.
Como toda classe por padrão herda de um Objeto expecifico (e já estamos cansados de saber disso), em Ruby não é diferente por isso nossas classes também, visto que herdam do objeto Object, terão acesso à função meu_nome.
Como deu pra ver, tudo em Ruby é um objeto incluindo qualquer coisa pôs métodos, variareis, etc. definidos em qualquer lugar não são coisas dispersas em um espaço estático e acessível sem vinculação com nada. Tudo que for definido será inserido em Object que por sua vez deriva pro o IRB, pro Kernel e pra qualquer outro objeto.
Acho que da pra dizer que o Kernel no ruby seria como o java.lang do java (corrijam me se estiver errado). Uma biblioteca importada por padrão, com métodos acessíveis sem a necessidade de informar o nome de sua classe.
Conclusão
Bom pessoal, falei um pouco de RoR, sua instalação, atualização e algumas outras pequenas configurações que existem pra serem feitas nos diferentes ambientes testados. Acho que não teve muita coisa nova pos o que mostrei já deve ta mais que batido.
Pode acontecer deu ter me equivocado? Pode sim, sem nenhum problema por isso me corrigirem se for o caso pos como disse no inicio, esse material foi pra fixar mais as idéias.
Estudem Ruby, não se prendam somente em RoR, RoR, RoR. É um bom framework? Sim, com toda certeza um dos melhores, mas Ruby a meu ver é muito mais essencial pra quem ta iniciando. Existem materiais excelentes na internet, quem poder e quiser baixar, eles estão ai aos milhares por isso, colocarei só um aqui pra vocês.
http://rapidlibrary.com/index.php?q=ruby+way
Existem alguns livros nacionais muito legais como “Ruby: desvendando a linguagem” (esse particularmente eu aconselho) e outros mais. Agora, quem quiser postar alguma coisa, sou todo ouvidos hehehehe.
Metaclasse em Ruby!
Esse assunto é bem legal porém as vezes muito confuso vou tentar explica-lo sem confundir.
O que é uma Metaclasse?
Para que serve uma Metaclasse?
Bem antes vamos falar de Classes e Objetos. Vamos fazer uma classe simples para usarmos como exemplo.
Uma Classe é composta de atributos e métodos, entao todos os Objetos de uma classe tem em comum seus atributos e métodos. Porém cada objetos tem seus atributos específicos, ou seja, se uma classe tem o atributo “nome” todos os objetos teram um nome, so que para cada objetos o nome é particular, ex. Joao, Maria, Jose, etc. sendo assim cada Objeto tem seu próprio atributo e é individual. Já os métodos, sao todos iguais para todos os objetos, a ação de um método é sempre igual em todos os objetos.
E o que isso implica? É que quando se instancia um Objeto, o Objeto é colocado em memória e lá é reservado espaço de memória para todos seus atributos, isso é importante para que possamos guardar valores individuais para cada Objeto. Porém os métodos são iguais a todos os Objetos e não faz sentido ocupar espaço em memória colocando para cada Objeto seus métodos é muito mais inteligente colocar todos os métodos em um único Obejto e esses métodos serem usados por todos os Objetos da mesma Classe.
Bem este Objeto que guarda em sí todos os métodos de uma Classe chama-se Metaclasse! Em Ruby uma Metaclasse é um Objeto(constante) Singleton, que guarda em sí todos os métodos e representa a classe durante a execução do código.
Em miudos, em Ruby uma Metaclasse é um Objeto que representa a Classe, ou seja, uma espécie de procurador, ou executor do que está escrito na Classe. Estranho, mais é isso, lembrando que Classe nunca faz nada, pois em Orientação a Objetos só Objetos podem fazer algo e não Classe. Isso torna o ruby uma linguagem altamente Orientada a Objetos. Costuma-se dizer que em Ruby até as Classes são Objetos porém não é bem verdade Classes continuam sendo documentos e as Metaclasses é que são os Objetos que representão a Classe.
Fica Assim! Quando se escreve uma classe em Ruby automaticamente o interpretador cria um Objetos(Metaclasse) que representa essa Classe, este Objeto é uma constante por isso tem a primeira letra em maiúcula e é singleton, ou seja, só existe uma instancia em execução. Por fim não podemos deixa de lembrar que a Metaclasse é um Objeto, sendo um Objeto ele vem de uma classe, que é a classe “Class”, e tem atributos e métodos como qualquer Objeto. Vejamos:
Notem que no Objeto(metaclasse) que representa a Classe “Teste” não tem o método “falar”, isso porque ele não e da classe “Teste” e sim da classe “Class” e tem o métodos da sua classe. Mais o Objeto(metaclasse) guarda em si alguns métodos legais, como o método “new”.
Em algums linguagens de programação a criação de uma instacia de um objeto é feito pelo interpretador, já em Ruby a criação de uma instacia de um Objeto é feita pela sua Metaclasse, isso é ser Orientado a Objetos.
Bem classicamente o método “new” lê a documentação, ou seja a “Classe” e cria um Objeto com seus atributos em memória. Essa ação é realizada pelo método “new”. Sendo um método é possivel mudar seu comportamento, pensemos algo como.
- Primeiro abrir uma conexao com o Banco de dados
- Ir em uma tabela e coletar o nome de suas colunas
- depois criar um Objeto que tenha seus atributos representando essas colunas
- criar também todos os métodos de persistencia para essas informações no bando
Ficou mais legal assim o método “new”! heheh!
Olha que legal, em Ruby por a Metaclasse ser responsável pelo criação de Objetos, a Metaclasse tem em si um método “new”, sendo um método eu posso sobrescreve-lo e mudar seu comportamento natural, e colocar mais aqueles passos no método “new”, assim eu posso automatimente criar um Objeto que seja um modelo de Dados persistente em Banco de dados. legal isso. Acho que voces ja viram essa idéia no Activerecord do RubyonRails. Talvez voce esteja falando, poxa como é facil, aquela mágica todo é so isso!
Porém o Poder a Metaclasse vai muito além disso, vejamos outro exemplo classico e muito poderoso:
Vamos pensar em atributos. Para que seus atributos sejam Encapsulas corretametne é necessário que se tenha os métodos acessores. Métodos acessores, como o nome ja diz são os métodos que dão acesso ao atributo, os famosos métodos gets e sets, sempre chatos! Bem para criarmos um atributo e seus acessore a classe ficaria assim:
Bem assim é que se faz encapsulamento de atributos, é sempre a mesma coisa e sempre chata, agora pense em um objeto que tem vários atributos para cada atributo seus métodos acessores, isso é um tormento e não melhora em nada o código, pois sempre é meiro do mesmo jeito.
Deixando a chatisse dos métodos acessore de lado, e lembrando que nós temos uma Objeto(metaclasse) que faz as coisas para mim, porque não criarmos um método na Objeto(metaclasse) que escreva os métodos acessores para mim. Poxa isso seria mágico eu passaria a chatisse para o Objeto(metaclasse) fazer. Isso ja foi feito e é usado assim:
Existe o método “attr_acessor” escreve o Atributo e seus métodos acessores, este método é do Objeto(metaclasse).
Como existe o método “attr_accessor” existem vários outro metodos que nso ajuda a diminuir a aquntidade de código durante a programação. O mais legal de tudo é que voce pode escrever seus próprio métodos de ajuda, sei lá, alguma rotina que voce esteja reescrevendo, ou algo que de para automatizar é legal esse recurso, lembrabdo de nao esquecer do conseito DRY.
Bem acho que este artigo ta ficando muito cansativo e longo, vamos continuar vendo em outro artigo!
No proximo artigo veremos como colocar funcionalidades na Metaclass.
E onde fica os métodos dos objetos na metaclasse, e adicionar novos metodos de instancia,
Espero que estejam gostando do assunto, valeu!!
Enviando email com RoR - A busca pela felicidade
Estive com um problema em mãos, criar um cadastro de contato e enviar por email, esse não é um grande problema, tendo em vista que uso RubyOnRails, que transforma a maioria dos meus problemas em soluções.
Buscando na NET (google, claro) achei os ótimos textos do Marcos Zimmermann
e claro, a famosa Rails para sua diversão e lucro do Ronaldo Melo Ferraz, que você encontrará em http://www.htmlstaff.org/ver.php?id=5016 (aliás, esta é sem dúvida uma referência em apostila para iniciantes em RoR, obrigado Ronaldo), também encontrei um texto em inglês: http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer mas… (sempre tem um mas!), acontece que, sempre que tentava iniciar o servidor ocorria o seguinte erro:
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:278:in `load_missing_constant’: uninitialized constant ActionMailer (NameError) .
Até onde eu sabia ActionMailer estava correto, será que era eu quem estava errado?
Após subir ao monte everest, procurar o monge-que-tudo-sabe para me mostrar o segredo da felicidade ele me disse:
Filho meu, o segredo é:
No arquivo config/enviroment.rb, em vez de usar ActionMailer::Base
use config.action_mailer
funciona que é uma beleza….
Agradeci ao grande monge, e segui minha viagem pelos trilhos…
então fica assim:
se for enviar email usando o gmail, seguindo o tutorial do Marcos Zimmermann em vez de:
ActionMailer::Base.default_content_type = "text/html" ActionMailer::Base.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :authentication => :plain, :domain => "sead.com", :user_name => "email@gmail.com", :password => '******'
}
use:
config.action_mailer.default_content_type = "text/html" config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :authentication => :plain, :domain => "sead.com", :user_name => "email@gmail.com", :password => '******'
}
ou se você está utilizando o Tutorial do Ronaldo Melo Ferraz, em vez de usar
ActionMailer::Base.server_settings = { :address => "mail.yourdomain.com", :domain => "yourdomain.com", :user_name => "user@yourdomain.com", :password => "******", :authentication => :login }
use:
config.action_mailer.server_settings = { :address => "mail.yourdomain.com", :domain => "yourdomain.com", :user_name => "user@yourdomain.com", :password => "******", :authentication => :login } Funcionou comigo, e também vai funcionar com você!
Outras configurações (não menos importantes), podem ser feitas no arquivo config/enviroment.rb, vou demonstrar algumas delas:
config.action_mailer.delivery_method = :smtp | :sedmail | :test
Configura o modo de entrega de email.
O modo :smtp é o default do rails no modo de desenvolvimento, se quiser desabilitar o envio de email nesse modo, edite o arquivo development.rb no diretório config/enviroments e adicione a seguinte linha:
config.action_mailer.delivery_method = :test, que é o padrão no modo de teste. O email não será enviado, mas sim anexado a um array (acessível via ActionMailer::Base.deliveries)
config.action_mailer.raise_delivery_errors = true | false
se estiver setado true, todo erro que ocorrer ao enviar o email levantará uma exceção.
Obs.: nem todos os erros são imediatos
config.action_mailer.default_charset = “utf-8”
não preciso falar muito, alguém tem dúvida?
Agradeço ao Marcos Zimmermann
e ao Ronaldo M. Ferraz pelos excelentes tutoriais.