Author
paulo-cesar-m-jeveaux
View
1.932
Download
1
Embed Size (px)
Conhecendo Ruby on RailsConhecendo Ruby on Rails
JevôPaulo César M. Jeveauxwww.jeveaux.comj
J ôJevô
• Consultor e Arquiteto Java
• Desenvolvedor Java há 7 anosDesenvolvedor Java há 7 anos
• Administrador do PortalJava e ESJUG
• Palestrante‐Entusiasta‐Evangelista Java e agora também Rails =)
A dAgenda
• A linguagem Ruby
• Ruby on Rails
• O exemplo: Blog• O exemplo: Blog
• Scaffold
• Testes
• Ajax
C ti b i• Como continuar e saber mais
R bRuby
• Linguagem de programação
• Open Source
• Orientada a objetosj
• Linguagem de scripts dinâmica e interpretada• Linguagem de scripts dinâmica e interpretada
d k h “ ”• Criada por Yukihiro “matz” Matsumoto em 1993 e disponibilizada ao público em 1995
R bRuby
• Interpretada– Fedback imediato no desenvolvimento
– Perde um pouco em performancePerde um pouco em performance
• Totalmente orientada a objetosT d é bj t– Tudo é um objeto
– 5 é uma instância da classe Fixnum
– Classes, herança, métodos, closures, etc
S i t Di â i I t t dScript Dinâmico e Interpretado
• Possibilidade de realizar chamadas ao Sistema O i l di t tOperacional diretamente
• Poderosas operações com strings e Expressões Regulares
• Feedback imediato no desenvolvimentoFeedback imediato no desenvolvimento
Rá id Fá ilRápida e Fácil
• 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
C tiCom e sem tipagem
• Variáveis não possuem tipagem estática ( S llt lk P th )(como em Smalltalk e Python)
• Dados fortemente tipados– O dado em memória é tipado e checado em tempo de execução (Runtime)tempo de execução (Runtime)
M lti d dMultiencadeada
• Multiencadeamento é a implementação de ltit f d t d ú imultitarefa dentro de um único processo
– Execução mais lentaç
– Os recursos são compartilhados em memória e d t i i ddevem ter o acesso sincronizado
– Várias tarefas executam de forma concorrente
– O multiencademento do Ruby é implementado no próprio interpretadorpróprio interpretador
R b R ilRuby on Rails
• 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
O é R il ?O que é Rails?
• 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‐mailsA ti M il– Action Mailer
• Suporte a Web Services• Suporte a Web Services– Action WebServices
A it t R ilArquitetura Rails
C dComeçando
• Instalar Ruby 1.8.6www 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 d )• Instalar Rails (linha de comando)– gem install rails
• Instalar MySQL (suporta outros bancos)Instalar MySQL (suporta outros bancos)– dev.mysql.com/downloads
C Fá ilComeço Fácil
• WindowsI t t R il– Instant Rails• wiki.rubyonrails.com/rails/pages/InstantRails
• Mac e LinuxMac e Linux– FiveRuns RB‐Install
fi / d t / /i t ll• www.fiveruns.com/products/rm/install
• Linuxsudo apt get install ruby irb rdoc– sudo apt-get install ruby irb rdoc
O lO exemplo
• 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.movp // y g/ / _ _ _
O bl t áO que o blog terá
• 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 CommentsComments
C i d j tCriando o projeto
• rails <projeto>– rails blog
C i d b d d dCriando o banco de dados
• Criando o banco de dados no MySQLd b j bi– create database <projeto>_<ambiente>
A bi tAmbientes
• Rails vem preparado para lidar com três bi t dif tambientes diferentes:
– Development (sandbox)
Test (testes unitários funcionais integrados)– Test (testes unitários, funcionais, integrados)
– Production (produção)
A li ã i dA aplicação criada
• Estrutura de diretórios
C fi dConfigurando
• Configuração mínima necessária: Banco de d d !dados!
C i d C t llCriando o Controller
• script/generate controller <nome>/– script/generate controller Blog
C t ll A tiControllers e Actions
• 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
C i d A tiCriando um Action
• Uma classe Controller pode ter várias Actions.
def index# f l i# faca alguma coisarender => :text “HelloWorld!”
end
E t d li ãExecutando a aplicação
• Execute/– script/server
• Irá iniciar o servidor de testes padrão, WEBRick nap ,porta 3000.
• Acesse: http://localhost:3000Acesse: http://localhost:3000
E t dExecutando
R t tRoteamento
• Como acessar o Controller e Action criados?– Roteamento customizável: config/routes.rb– http://localhost:3000/:controller/:action/:idhttp://localhost:3000/:controller/:action/:id
R t tRoteamento
E t d A tiExecutando uma Action
• Seguindo a regra anterior de roteamento– http://localhost:3000/blog/index
– blog = app/controller/blog_controller.rb– index = método index em BlogController
C õ t tConvenções e comportamento
• 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)( y p )
– .rjs ‐ Javascript Generator (Ruby puro)
• Este fluxo pode ser interrompido com uma chamada explícita ao método render ou redirect_to
C i d ViCriando uma View
• 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
C i d ViCriando uma View
C i d ViCriando uma View
C i d ViCriando uma View
C i d tid d P tCriando a entidade Post
• script/generate model <nome>/– script/generate model Post
M t d dMantendo sempre a ordem
• Migration–Manutenção de tabelas usando Ruby
– Independente de bancoIndependente de banco
– Também suporta SQL nativo
R kRake
• Rake é a ferramenta para execução de tarefas i l t d R b R k é M kimplementadas em Ruby. Rake é o Make para Rubyy
• Primeira tarefa: manutenção das tabelas– rake migrate
k i trake migrate
• Toda entidade criada com script/generate gera um arquivo de Migration no diretório db/migrateMigration 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
M d t b lMapeando as tabelas
• A classe Post já é capaz de gerenciar os dados da tabela no banco de dadostabela 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 nomemapear uma coluna para outro atributo de nome diferente
M i õMais convenções
• Toda entidade é criada no diretório padrão:– /app/models/<controller>/<model>.rbpp
• 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 chaveConvenção: Surrogate Key, toda tabela tem uma chave primária chamada “id” que é um número auto‐incrementável
A t d M d lAnotando os Modelos
• 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
S ff ldScaffold
• Colocar o método scaffold :<model> no controller é suficientesuficiente
• 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 f lfacilitar prototipação
T l S ff ldTelas com Scaffold
T l S ff ldTelas com Scaffold
T l S ff ldTelas com Scaffold
C fi d P tConfigurando o Post
• Acrecentando uma validação– validate_presence_of :title
T t d lid ãTestando validação
M lh d P tMelhorando o Post
• Criando novas colunas com Migration
• script/generate migration <atividade>– script/generate migration AdicionarColunasPostp g g
M lh d P tMelhorando o Post
M lh d P tMelhorando o Post
C i d P tCriando um novo Post
• Testando sem reiniciar
• Verifique as novas colunas
C i d P tCriando um novo Post
• Testando sem reiniciar
• Verifique as novas colunas
G d S ff ldGerando o Scaffold
• script/generate scaffold <model> <controller>– script/generate scaffold Post Blog
S ff ld d !Scaffold gerado!
• Toda execução que era automática agora está t i d ditexposta em arquivos que podemos editar
como quisermosq
• Provado: Rails não se restringe a Scaffold áautomático
• Podemos mudar a listagem de Posts porPodemos mudar a listagem de Posts, por exemplo, em:– /app/views/blog/list.rhtml
A i dArquivos gerados
A i dArquivos gerados
A i dArquivos gerados
C i d tid d C tCriando a entidade Comment
• Hora de criar a entidade Comment/– script/generate model Comment
• Lembre‐se: esta entidade será associada a umLembre se: esta entidade será associada a um Post
R k O i d tRake: Organizando novamente
• Comment pertence a Post através da coluna t idpost_id.
• Convenção de Chave Estrangeira: <classe> idConvenção de Chave Estrangeira: <classe>_id
• rake migrate
R k O i d tRake: Organizando novamente
R k O i d tRake: Organizando novamente
C i d i õCriando as associações
• Na classe Post– has_many :comments
• Na classe Comments– belongs_to :post
C i d i õCriando as associações
C i d i õCriando as associações
U d i õUsando as associações
• Criar um formulário de Comment na tela de d t lh d P tdetalhe de um Post– /app/views/blog/show.rhtml/ pp/ / g/
P ti lPartials
• “Don’t Repeat Yourself” (DRY)
• Uma das maneiras de separar trechos de código• Uma das maneiras de separar trechos de código
• Toda partial começa com underline “_”
d l " " ll– <%= render :partial => "comment", :collection => @post.comments %>
• Associação has_many em Post automaticamente fornece um hash chamado comments (nome da outra entidade no plural)
A ti C tAction para Comment
• <% form_for :comment, @comment, :url => {:action => 'add comment' :id =>=> {:action => add_comment , :id => @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 d f lá i i dcampos do formulário enviado.
A ti C tAction para Comment
R lt d fi lResultado final
T t U itá iTestes Unitários
• Toda nova entidade ganha um arquivo para t t itá iteste unitário em:– /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?”
A bi t d T tAmbiente de Testes
• Os testes acontecem em banco de dados separado do desenvolvimentodo desenvolvimento– <projeto>_test
• Cada teste roda de maneira isolada: os dados difi d t t ã f t t t tmodificados em um teste não afetam outro teste
• Cada teste unitário tem um arquivo de “fixture”, carga de dados para testes:g p– /app/test/fixture/<tabela>.yml
R d d T t U itá iRodando os Testes Unitários
• Todos os testes unitários– rake test:units
• Apenas um teste unitário:– ruby test/unit/<entidade>_test.rb
T t F i iTestes Funcionais
• Todo novo controller ganha uma classe de teste em:/ /t t/f ti l/< l > t ll t t b– /app/test/functional/<classe>_controller_test.rb
• Devemos testar cada action do controller
• Métodos como get e post simulam navegação com um browserum browser
• Todos os testes funcionais:– rake test:functionalsa e test: u ct o a s
• Apenas um testes funcional:r b test/f nctional/<classe> controller test rb– ruby test/functional/<classe>_controller_test.rb
T tTestes
• Testes Unitários devem testar todos os aspectos da entidade como associações validações callbacks etcentidade como associações, validações, callbacks, etc
• Testes Funcionais devem testar todas as actions de um mesmo controller todos os fluxosum 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 testeFuncionam de maneira semelhante a um teste funcional
AjAjax
• Rails é o melhor modelo de framework para AjAjax
• Ajax é codificado em Ruby puro
• Integração com as bibliotecas Prototype e Script.aculo.usScript.aculo.us
Adi i d AjAdicionando Ajax
• 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 decontrário redireciona para a mesma action de antes, que retorna a página toda
A t RJSA arma secreta: RJS
• Seguindo as convenções, ao utilizarmos Ajax a ti dd t taction add_comment espera encontrar a
página:p g– /app/views/blog/add_comment.rjs
Ati t t f itAtive e teste o efeito
• O ajax é ativado por controller através de seu l t ét d j i t i l d tlayout com o método javascript_include_tag
• Acesse e comprove– http://localhost:3000/blog
Bl P t !Blog Pronto!
• Mini Blog criado conforme requerimentos iniciais
• Plus: pequeno brinde via Ajax
• Conseguimos criar entidades e tabelas sem mapear campo‐a‐campo manualmentecampo manualmente– deixe o computador trabalhar por nós
• Infraestrutura completa de testes unitários, funcionais e integradosg
• Obs: este é um aplicativo de demonstração, muito mais aindaObs: este é um aplicativo de demonstração, muito mais ainda pode ser feito !
S i tl t!?Scriptlet!?
• Rails não utiliza taglibs
• Ruby é simples e expressiva o suficiente para não y p p pprecisar 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
O ã fi ?O que não fizemos?
• Não precisamos recompilar e reinstalar o aplicativo a cada mudançacada mudança
Nã i i i i id d d• Não precisamos reiniciar o servidor a cada mudança
• Não precisamos mapear cada uma das colunas das tabelas para as entidadestabelas para as entidades
Nã i fi d d i XML• Não precisamos configurar dezenas de arquivos XML. Basicamente colocamos a senha do banco de dados, apenas
O ã fi ?O que não fizemos?
• Não precisamos usar Javascript para fazer Ajax: a maior parte pode ser feita com Ruby puromaior parte pode ser feita com Ruby puro
Nã i f l d lib õ R b• Não sentimos falta de taglibs: expressões Ruby, partials foram simples o suficiente
• Não precisamos codificar código‐cola, o frameworkNão precisamos codificar código cola, o framework possui “padrões espertos” afinal, todo aplicativo Web tem a mesma infraestruturaWeb tem a mesma infraestrutura
Próximos passos?
Próximos passos?
Rails no Brasil?Rails no Brasil?
Próximos passos?
Rails no Brasil?Rails no Brasil?
Gostei! Quero me aprofundarGostei! Quero me aprofundar
A difi ld d d d JA dificuldade de aprender Java
M ti F l R ilMartin Fowler on Rails
• Famoso escritor de livros especializados em arquitetura de sistemasarquitetura de sistemas
• Reconhecido nome na comunidade Java
• Desenvolvendo projetos em Rails
• Celebridade do mundo Java apoiando Rails• Celebridade do mundo Java apoiando Rails
R il B il i i i ti Akit O R ilRails no Brasil: iniciativa Akita On Rails
R b R il B ilRuby on Rails no Brasil
P ó i PPróximos Passos
• 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
A d iAprenda mais
• 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 anosUtilizando diversas plataformas de desenvolvimento há 14 anos
– Pela editora Brasport, já disponível!
Q tá t á d R b ?Quem está por trás do Ruby?
• 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”. A d t “d dê i ” id d é f tApesar desta “dependência”, a comunidade é forte a ponto de sobreviver “caso o Matz seja atropelado por um ônibus” Existem pessoas que estão tão inteiradasum ô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
á i ti f it iusuários satisfeitos e por empresas que conseguiram aumentar sua produtividade utilizando Ruby.
Fonte: ruby‐br.org
R f ê iReferências
• www.ruby‐lang.org
b il• www.rubyonrails.org
• www.rubyonrails.com.bry
• www.ruby‐br.org
A d i i l F bi Aki• Agradecimento especial ao Fabio Akita por gentilmente permitir a utilização de diversos slides de suas palestras:
– www akitaonrails comwww.akitaonrails.com• Palestra: Entendendo RailsP l R b R il B il• Palestra: Ruby on Rails no Brasil
D íd C íti S tõDuvídas, Críticas e Sugestões
• Para contato:–www.jeveaux.com
t lj–www.portaljava.com–[email protected]@jeveaux.com
Obrigado a todos!Obrigado a todos!