1. O documento apresenta uma introdução ao framework Ruby on Rails, descrevendo suas principais características e funcionalidades.
2. É apresentado um exemplo prático de desenvolvimento de um sistema de blog usando Rails, cobrindo tópicos como geração de projeto, controllers, views e models.
3. O documento fornece instruções passo-a-passo para configurar e executar a aplicação de exemplo.
2. Jevô
Jô
• Consultor e Arquiteto Java
• Desenvolvedor Java há 7 anos
Java há 7 anos
• Administrador do PortalJava e ESJUG
• Palestrante‐Entusiasta‐Evangelista Java e
agora também Rails =)
3. Agenda
Ad
• A linguagem Ruby
• Ruby on Rails
• O exemplo: Blog
O exemplo: Blog
• Scaffold
• Testes
• Ajax
• Como continuar e saber mais
C ti b i
4. Ruby
Rb
• Linguagem de programação
• Open Source
• Orientada a objetos
j
• Linguagem de scripts dinâmica e interpretada
de scripts dinâmica e interpretada
• Criada por Yukihiro “matz” Matsumoto em 1993
d kh “ ”
e disponibilizada ao público em 1995
5. Ruby
Rb
• Interpretada
– Fedback imediato no desenvolvimento
– Perde um pouco em performance
Perde um pouco em performance
• Totalmente orientada a objetos
–T d é
Tudo é um objeto
bj t
– 5 é uma instância da classe Fixnum
– Classes, herança, métodos, closures, etc
6. Script Dinâmico e Interpretado
S i t Di â i It td
• Possibilidade de realizar chamadas ao Sistema
Operacional diretamente
O i l di t t
• Poderosas operações com strings e Expressões
Regulares
• Feedback imediato no desenvolvimento
Feedback imediato no desenvolvimento
7. Rápida e Fácil
Rá id Fá il
• Não é necessário declarar variáveis
• Variáveis não tem tipo (não são “tipadas”)
Variáveis não tem tipo (não são tipadas )
• A sintaxe é simples e consistente;
• A gestão de memória é automática
– Garbage Collector
8. Com e sem tipagem
C ti
• Variáveis não possuem tipagem estática
(como em Smalltalk e Python)
( S llt lk P th )
• Dados fortemente tipados
– O dado em memória é tipado e checado em
tempo de execução (Runtime)
tempo de execução (Runtime)
9. Multiencadeada
M lti dd
• Multiencadeamento é a implementação de
multitarefa dentro de um único processo
ltit f d t d úi
– Execução mais lenta
ç
– Os recursos são compartilhados em memória e
devem ter o acesso sincronizado
d t i id
– Várias tarefas executam de forma concorrente
– O multiencademento do Ruby é implementado no
próprio interpretador
próprio interpretador
10. Ruby on Rails
Rb R il
• Framework para desenvolvimento de aplicações Web;
• Criado com a linguagem Ruby;
• Desenvolvido por David Heinemeier Hansson, da
37signals;
• Extraído de um produto real: o Basecamp
• De um produto real para um mundo real
11. O que é Rails?
O é R il ?
• Framework completo para desenvolvimento de aplicativos
Web
• Pacote MVC (Model‐View‐Controller)
– Action Pack (Action Controller e Action View)
– Active Record
• Suporte a envio e recebimento de e‐mails
– A ti M il
Action Mailer
• Suporte a Web Services
Suporte a Web Services
– Action WebServices
13. Começando
C d
• Instalar Ruby 1.8.6
– www ruby lang org/en/downloads
www.ruby‐lang.org/en/downloads
• Instalar RubyGems
– rubyforge.org/frs/?group_id=126
• I t l R il (li h d
Instalar Rails (linha de comando)
d)
– gem install rails
• Instalar MySQL (suporta outros bancos)
Instalar MySQL (suporta outros bancos)
– dev.mysql.com/downloads
14. Começo Fácil
C Fá il
• Windows
– I t t R il
Instant Rails
• wiki.rubyonrails.com/rails/pages/InstantRails
• Mac e Linux
Mac e Linux
– FiveRuns RB‐Install
• www.fiveruns.com/products/rm/install
fi / d t / /i t ll
• Linux
– sudo apt get install ruby irb rdoc
apt-get
15. O exemplo
O l
• Sistema de Blog
– Baseado no exemplo do blog do screencast de
David Hansson no rubyonrails.org. O exemplo se
chama: “Creating a weblog in 15 minutes”
• http://media.rubyonrails.org/video/rails_take2_with_sound.mov
p // y g/ /
16. O que o blog terá
O bl t á
• Uma tabela de Posts
• Uma tabela associada de Comments
• Uma tela de listagem de Posts
Uma tela de listagem de Posts
• Uma tela de criação e edição de Posts
ç ç
• Uma tela de detalhes do Post
• No detalhe do Post veremos e adicionaremos
Comments
18. Criando o banco de dados
Ci d b d dd
• Criando o banco de dados no MySQL
– create d
database <projeto>_<ambiente>
b j bi
19. Ambientes
A bi t
• Rails vem preparado para lidar com três
ambientes diferentes:
bi t dif t
– Development (sandbox)
– Test (testes unitários funcionais integrados)
(testes unitários, funcionais, integrados)
– Production (produção)
21. Configurando
C fi d
• Configuração mínima necessária: Banco de
dados!
dd !
22. Criando o Controller
Ci d C t ll
• script/generate controller <nome>
– script/generate controller Blog
/
23. Controllers e Actions
C t ll A ti
• Todo Controller fica no diretório:
– /app/controllers/<nome> controller.rb
/app/controllers/<nome>_controller.rb
• Todo Controller herda a classe ApplicationController
Todo Controller herda a classe ApplicationController
• Todo aplicativo Rails é criado com uma classe chamada
ApplicationController, que herda de ActionController::Base, e
é base de todos os outros controllers
• Todo método de um controller é chamado de Action
24. Criando um Action
Ci d A ti
• Uma classe Controller pode ter várias Actions.
def index
#ffaca alguma coisa
l i
render => :text “HelloWorld!”
end
25. Executando a aplicação
E td li ã
• Execute
– script/server
/
• Irá iniciar o servidor de testes padrão, WEBRick na
p ,
porta 3000.
• Acesse: http://localhost:3000
Acesse: http://localhost:3000
27. Roteamento
Rt t
• Como acessar o Controller e Action criados?
– Roteamento customizável: config/routes.rb
– http://localhost:3000/:controller/:action/:id
29. Executando uma Action
E td A ti
• Seguindo a regra anterior de roteamento
– http://localhost:3000/blog/index
– blog = app/controller/blog_controller.rb
– index = método index em BlogController
30. Convenções e comportamento
C õ t t
• Ao final de toda Action, Rails chamará uma view com
o mesmo nome da Action, no seguinte diretório:
o mesmo nome da Action no seguinte diretório:
– /app/views/<controller>/<action>.<ext>
• A extensão do arquivo pode ser:
q p
– .rhtml ‐ Embedded Ruby (HTML+Ruby)
– .rxml ‐ XML Builder (Ruby puro)
( yp )
– .rjs ‐ Javascript Generator (Ruby puro)
• Este fluxo pode ser interrompido com uma chamada
explícita ao método render ou redirect_to
31. Criando uma View
Ci d Vi
• Criar index.rhtml em /app/views/blog/
<h3>HelloWorld! (view)</h3>
• Comentar a linha com o render no método
index do BlogController
• Acesse novamente e comprove
Acesse novamente e comprove
– http://localhost:3000/blog/index
35. Criando a entidade Post
Ci d tid d P t
• script/generate model <nome>
– script/generate model Post
/
36. Mantendo sempre a ordem
Mtd d
• Migration
– Manutenção de tabelas usando Ruby
– Independente de banco
Independente de banco
– Também suporta SQL nativo
37. Rake
Rk
• Rake é a ferramenta para execução de tarefas
implementadas em Ruby. Rake é o Make para
il td Rb Rk é Mk
Rubyy
• Primeira tarefa: manutenção das tabelas
– rake migrate
38. rake migrate
kit
• Toda entidade criada com script/generate gera um arquivo de
Migration no diretório db/migrate
Migration no diretório db/migrate
• Todo arquivo Migration é numerado:
Todo arquivo Migration é numerado:
– 001_create_posts.rb
• O comando rake migrate executa os arquivos em db/migrate
• O gerenciamento do banco de dados é feito totalmente em
Ruby
39. Mapeando as tabelas
M d tbl
• A classe Post já é capaz de gerenciar os dados da
tabela no banco de dados
tabela no banco de dados
– ActiveRecord
• Não há necessidade de explicitar o mapeamento das
colunas do banco com atributos da classe
• Rails não proíbe nada: se for necessário existe como
mapear uma coluna para outro atributo de nome
mapear uma coluna para outro atributo de nome
diferente
40. Mais convenções
Mi õ
• Toda entidade é criada no diretório padrão:
– /app/models/<controller>/<model>.rb
pp
• Toda entidade herda diretamente da classe
ActiveRecord::Base
• Não é preciso mapear manualmente as colunas da tabela
• Convenção: a classe tem o nome no singular (Post), a tabela
tem o nome do plural (posts)
p (p )
• Convenção: Surrogate Key, toda tabela tem uma chave
Convenção: Surrogate Key, toda tabela tem uma chave
primária chamada “id” que é um número auto‐incrementável
41. Anotando os Modelos
Atd Mdl
• Plugin de Dave Thomas
• Instalação (via internet):
– script/plugin install annotate_models
• Utilização (via rake):
– rake annotate_models
• Lê a tabela do banco de dados e coloca um
Lê a tabela do banco de dados e coloca um
cabeçalho como comentário na classe entidade
42. Scaffold
S ff ld
• Colocar o método scaffold :<model> no controller é
suficiente
• Telas CRUD (Create, Read, Update, Delete) geradas
automaticamente em tempo de execução (runtime)
automaticamente em tempo de execução (runtime)
• CUIDADO: Rails NÃO é Scaffold
• Scaffold é apenas uma pequena funcionalidade para
facilitar prototipação
fl
48. Melhorando o Post
M lh d Pt
• Criando novas colunas com Migration
• script/generate migration <atividade>
– script/generate migration AdicionarColunasPost
pg g
51. Criando um novo Post
Ci d Pt
• Testando sem reiniciar
• Verifique as novas colunas
52. Criando um novo Post
Ci d Pt
• Testando sem reiniciar
• Verifique as novas colunas
53. Gerando o Scaffold
G d S ff ld
• script/generate scaffold <model> <controller>
– script/generate scaffold Post Blog
54. Scaffold gerado!
S ff ld d!
• Toda execução que era automática agora está
exposta em arquivos que podemos editar
t i d dit
como quisermos
q
• Provado: Rails não se restringe a Scaffold
automático
á
• Podemos mudar a listagem de Posts por
Podemos mudar a listagem de Posts, por
exemplo, em:
– /app/views/blog/list.rhtml
58. Criando a entidade Comment
Ci d tid d C t
• Hora de criar a entidade Comment
– script/generate model Comment
/
• Lembre‐se: esta entidade será associada a um
Lembre se: esta a um
Post
59. Rake: Organizando novamente
Rk O id t
• Comment pertence a Post através da coluna
post_id.
t id
• Convenção de Chave Estrangeira: <classe> id
Convenção de Chave Estrangeira: <classe>_id
• rake migrate
65. Usando as associações
Ud iõ
• Criar um formulário de Comment na tela de
detalhe de um Post
d t lh d Pt
– /app/views/blog/show.rhtml
/ pp/ / g/
66. Partials
P ti l
• “Don’t Repeat Yourself” (DRY)
• Uma das maneiras de separar trechos de código
das maneiras de separar de código
• Toda partial começa com underline “_”
– <%= render :partial => quot;commentquot;, :collection =>
d lquot; quot; ll
@post.comments %>
• Associação has_many em Post automaticamente fornece um
hash chamado comments (nome da outra entidade no plural)
67. Action para Comment
A ti C t
• <% form_for :comment, @comment, :url
=> {:action => 'add comment', :id =>
add_comment
@post } do |f| %>
– Action esperada: add_comment
– Passando parâmetros: params[:id] e
Passando parâmetros: params[:id] e
params[:comment]
– Hash params[:comment] contém todos os
campos do formulário enviado.
df lá i id
70. Testes Unitários
T t U itá i
• Toda nova entidade ganha um arquivo para
teste unitário em:
tt itá i
– /app/test/unit/<entidade>_test.rb
/ pp/ / /
• Devemos seguir Test‐Driven Development:
– “Se não vale a pena testar para que estamos
Se não vale a pena testar, para que estamos
codificando?”
71. Ambiente de Testes
A bi t d T t
• Os testes acontecem em banco de dados separado
do desenvolvimento
do desenvolvimento
– <projeto>_test
• Cada teste roda de maneira isolada: os dados
modificados em um teste não afetam outro teste
difi d t t ã ft ttt
• Cada teste unitário tem um arquivo de “fixture”,
carga de dados para testes:
g p
– /app/test/fixture/<tabela>.yml
72. Rodando os Testes Unitários
Rd d T t U itá i
• Todos os testes unitários
– rake test:units
• Apenas um teste unitário:
– ruby test/unit/<entidade>_test.rb
73. Testes Funcionais
Tt F i i
• Todo novo controller ganha uma classe de teste em:
–/
/app/test/functional/<classe>_controller_test.rb
/t t/f ti l/< l > t ll t t b
• Devemos testar cada action do controller
• Métodos como get e post simulam navegação com
um browser
um browser
• Todos os testes funcionais:
– rake test: u ct o a s
a e test:functionals
• Apenas um testes funcional:
– r b test/f nctional/<classe> controller test rb
ruby test/functional/<classe>_controller_test.rb
74. Testes
Tt
• Testes Unitários devem testar todos os aspectos da
entidade como associações, validações, callbacks, etc
entidade como associações validações callbacks etc
• Testes Funcionais devem testar todas as actions de
um mesmo controller, todos os fluxos,
um mesmo controller todos os fluxos
redirecionamentos, filtros, etc
• Testes Integrados servem para avaliar a navegação e
g p gç
fluxos entre actions de diferentes controllers.
Funcionam de maneira semelhante a um teste
Funcionam de maneira semelhante a um teste
funcional
75. Ajax
Aj
• Rails é o melhor modelo de framework para
Ajax
Aj
• Ajax é codificado em Ruby puro
• Integração com as bibliotecas Prototype e
Script.aculo.us
76. Adicionando Ajax
Adi i d Aj
• Na View
– Apenas trocar form_for para remote_form_for
• Na Action
– request.xhr? checa se veio chamada via Ajax. Caso
contrário redireciona para a mesma action de
contrário redireciona para a mesma action de
antes, que retorna a página toda
77. A arma secreta: RJS
A t RJS
• Seguindo as convenções, ao utilizarmos Ajax a
action add_comment espera encontrar a
ti dd t t
pg
página:
– /app/views/blog/add_comment.rjs
78. Ative e teste o efeito
Ati tt f it
• O ajax é ativado por controller através de seu
layout com o método javascript_include_tag
l t ét d j iti ld t
• Acesse e comprove
– http://localhost:3000/blog
79. Blog Pronto!
Bl P t !
• Mini Blog criado conforme requerimentos iniciais
• Plus: pequeno brinde via Ajax
• Conseguimos criar entidades e tabelas sem mapear campo‐a‐
campo manualmente
campo manualmente
– deixe o computador trabalhar por nós
• Infraestrutura completa de testes unitários, funcionais e
integrados
g
• Obs: este é um aplicativo de demonstração, muito mais ainda
Obs: este é um aplicativo de demonstração, muito mais ainda
pode ser feito !
80. Scriptlet!?
S i tl t!?
• Rails não utiliza taglibs
• Ruby é simples e expressiva o suficiente para não
y p p p
precisar de artifícios
• Taglibs são simplificações de lógica
• Podemos fazer tudo de maneira simples e flexível
Podemos fazer tudo de maneira simples e flexível
sem precisar aprender sintaxes complexas de XML
81. O que não fi
O ã fizemos?
?
• Não precisamos recompilar e reinstalar o aplicativo a
cada mudança
cada mudança
• Nã
Não precisamos reiniciar o servidor a cada mudança
i iii id d d
• Não precisamos mapear cada uma das colunas das
tabelas para as entidades
tabelas para as entidades
• Nã
Não precisamos configurar dezenas de arquivos XML.
i fi d d i XML
Basicamente colocamos a senha do banco de dados,
apenas
82. O que não fi
O ã fizemos?
?
• Não precisamos usar Javascript para fazer Ajax: a
maior parte pode ser feita com Ruby puro
maior parte pode ser feita com Ruby puro
• Nã
Não sentimos falta de taglibs: expressões Ruby,
i fl d lib õ Rb
partials foram simples o suficiente
• Não precisamos codificar código‐cola, o framework
Não precisamos codificar código cola, o framework
possui “padrões espertos” afinal, todo aplicativo
Web tem a mesma infraestrutura
Web tem a mesma infraestrutura
87. Martin Fowler on Rails
M ti F l R il
• Famoso escritor de livros especializados em
arquitetura de sistemas
arquitetura de sistemas
• Reconhecido nome na comunidade Java
• Desenvolvendo projetos em Rails
• Celebridade do mundo Java apoiando Rails
Celebridade do mundo Java apoiando Rails
90. Próximos Passos
Pói P
• Aprender mais!
– Programming Ruby (livro gratuito!)
– http://www.rubycentral.com/book/intro.html
– Agile Web Development With Rails (livro mais famoso de Rails)
– http://www.pragmaticprogrammer.com/titles/rails2/
// / / /
– Melhores websites sobre Ruby e Rails
Melhores websites sobre Ruby e Rails
– http://del.icio.us/fabioakita/rubyonrails
– Akita On Rails: principal site de Rails do Brasil
– http://www.akitaonrails.com
91. Aprenda mais
A d i
• Repensando a Web com Rails
– Primeiro livro de Ruby on Rails em português no Brasil
– Documentação completa do Rails versão 1.1.2
ç p
– Cada um dos tópicos desta demonstração em detalhes
– Por Fabio Akita (www.akitaonrails.com)
• Consultor SAP há 5 anos
• Gerente de Projetos PMP
• Desenvolvedor Java há 8 anos
• Utilizando diversas plataformas de desenvolvimento há 14 anos
de desenvolvimento 14 anos
– Pela editora Brasport, já disponível!
92. Quem está por trás do Ruby?
Q tá tá d R b ?
• Ainda hoje, Matz é o responsável por todas as decisões
não‐consensuais do Ruby. Ou seja, qualquer
divergência quanto à implementação de uma nova
funcionalidade é resolvida pelo “ditador benevolente”.
Apesar desta “dependência”, a comunidade é forte a
A d t “d dê i ” id d é f t
ponto de sobreviver “caso o Matz seja atropelado por
um ônibus Existem pessoas que estão tão inteiradas
um ônibus”. Existem pessoas que estão tão inteiradas
com o código quanto o próprio Matz. Diferentemente
de outras tecnologias opensource, não existe uma
g p ,
empresa por trás de suas operações, bancando os
custos. O projeto sobrevive de doações feitas pelos
usuários satisfeitos e por empresas que conseguiram
ái ti f it i
aumentar sua produtividade utilizando Ruby.
Fonte: ruby‐br.org
93. Referências
Rf ê i
• www.ruby‐lang.org
• www.rubyonrails.org
b il
• www.rubyonrails.com.br
y
• www.ruby‐br.org
• Agradecimento especial ao Fabio Akita por
A di i l F bi Aki
gentilmente permitir a utilização de diversos slides
de suas palestras:
– www akitaonrails com
www.akitaonrails.com
• Palestra: Entendendo Rails
•Pl
Palestra: Ruby on Rails no Brasil
Rb R il B il
94. Duvídas, Críticas e Sugestões
D íd C íti S tõ
• Para contato:
– www.jeveaux.com
– www.portaljava.com
t lj
– paulo@jeveaux.com
– jeveaux@portaljava.com
Obrigado a todos!
Obrigado a todos!