94
Conhecendo Ruby on Rails Conhecendo Ruby on Rails Jevô Paulo César M. Jeveaux www.jeveaux.com

Ruby On Rails

Embed Size (px)

Citation preview

Page 1: Ruby On Rails

Conhecendo Ruby on RailsConhecendo Ruby on Rails

JevôPaulo César M. Jeveauxwww.jeveaux.comj

Page 2: Ruby On Rails

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 =)

Page 3: Ruby On 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

Page 4: Ruby On Rails

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

Page 5: Ruby On Rails

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

Page 6: Ruby On Rails

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

Page 7: Ruby On Rails

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

Page 8: Ruby On Rails

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)

Page 9: Ruby On Rails

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

Page 10: Ruby On Rails

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

Page 11: Ruby On Rails

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

Page 12: Ruby On Rails

A it t R ilArquitetura Rails

Page 13: Ruby On 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

Page 14: Ruby On Rails

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

Page 15: Ruby On Rails

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/ / _ _ _

Page 16: Ruby On Rails

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

Page 17: Ruby On Rails

C i d j tCriando o projeto

• rails <projeto>– rails blog

Page 18: Ruby On Rails

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>

Page 19: Ruby On Rails

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)

Page 20: Ruby On Rails

A li ã i dA aplicação criada

• Estrutura de diretórios

Page 21: Ruby On Rails

C fi dConfigurando

• Configuração mínima necessária: Banco de d d !dados!

Page 22: Ruby On Rails

C i d C t llCriando o Controller

• script/generate controller <nome>/– script/generate controller Blog

Page 23: Ruby On Rails

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

Page 24: Ruby On Rails

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

Page 25: Ruby On Rails

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

Page 26: Ruby On Rails

E t dExecutando

Page 27: Ruby On Rails

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

Page 28: Ruby On Rails

R t tRoteamento

Page 29: Ruby On Rails

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

Page 30: Ruby On Rails

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

Page 31: Ruby On Rails

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

Page 32: Ruby On Rails

C i d ViCriando uma View

Page 33: Ruby On Rails

C i d ViCriando uma View

Page 34: Ruby On Rails

C i d ViCriando uma View

Page 35: Ruby On Rails

C i d tid d P tCriando a entidade Post

• script/generate model <nome>/– script/generate model Post

Page 36: Ruby On Rails

M t d dMantendo sempre a ordem

• Migration–Manutenção de tabelas usando Ruby

– Independente de bancoIndependente de banco

– Também suporta SQL nativo

Page 37: Ruby On Rails

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

Page 38: Ruby On Rails

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

Page 39: Ruby On Rails

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

Page 40: Ruby On Rails

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

Page 41: Ruby On Rails

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

Page 42: Ruby On Rails

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

Page 43: Ruby On Rails

T l S ff ldTelas com Scaffold

Page 44: Ruby On Rails

T l S ff ldTelas com Scaffold

Page 45: Ruby On Rails

T l S ff ldTelas com Scaffold

Page 46: Ruby On Rails

C fi d P tConfigurando o Post

• Acrecentando uma validação– validate_presence_of :title

Page 47: Ruby On Rails

T t d lid ãTestando validação

Page 48: Ruby On Rails

M lh d P tMelhorando o Post

• Criando novas colunas com Migration

• script/generate migration <atividade>– script/generate migration AdicionarColunasPostp g g

Page 49: Ruby On Rails

M lh d P tMelhorando o Post

Page 50: Ruby On Rails

M lh d P tMelhorando o Post

Page 51: Ruby On Rails

C i d P tCriando um novo Post

• Testando sem reiniciar

• Verifique as novas colunas

Page 52: Ruby On Rails

C i d P tCriando um novo Post

• Testando sem reiniciar

• Verifique as novas colunas

Page 53: Ruby On Rails

G d S ff ldGerando o Scaffold

• script/generate scaffold <model> <controller>– script/generate scaffold Post Blog

Page 54: Ruby On Rails

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

Page 55: Ruby On Rails

A i dArquivos gerados

Page 56: Ruby On Rails

A i dArquivos gerados

Page 57: Ruby On Rails

A i dArquivos gerados

Page 58: Ruby On Rails

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

Page 59: Ruby On Rails

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

Page 60: Ruby On Rails

R k O i d tRake: Organizando novamente

Page 61: Ruby On Rails

R k O i d tRake: Organizando novamente

Page 62: Ruby On Rails

C i d i õCriando as associações

• Na classe Post– has_many :comments

• Na classe Comments– belongs_to :post

Page 63: Ruby On Rails

C i d i õCriando as associações

Page 64: Ruby On Rails

C i d i õCriando as associações

Page 65: Ruby On Rails

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/

Page 66: Ruby On Rails

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)

Page 67: Ruby On Rails

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.

Page 68: Ruby On Rails

A ti C tAction para Comment

Page 69: Ruby On Rails

R lt d fi lResultado final

Page 70: Ruby On Rails

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?”

Page 71: Ruby On Rails

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

Page 72: Ruby On Rails

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

Page 73: Ruby On Rails

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

Page 74: Ruby On Rails

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

Page 75: Ruby On Rails

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

Page 76: Ruby On Rails

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 

Page 77: Ruby On Rails

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

Page 78: Ruby On Rails

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

Page 79: Ruby On Rails

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 !

Page 80: Ruby On Rails

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

Page 81: Ruby On Rails

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

Page 82: Ruby On Rails

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

Page 83: Ruby On Rails

Próximos passos?

Page 84: Ruby On Rails

Próximos passos?

Rails no Brasil?Rails no Brasil?

Page 85: Ruby On Rails

Próximos passos?

Rails no Brasil?Rails no Brasil?

Gostei! Quero me aprofundarGostei! Quero me aprofundar

Page 86: Ruby On Rails

A difi ld d d d JA dificuldade de aprender Java

Page 87: Ruby On Rails

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

Page 88: Ruby On Rails

R il B il i i i ti Akit O R ilRails no Brasil: iniciativa Akita On Rails

Page 89: Ruby On Rails

R b R il B ilRuby on Rails no Brasil

Page 90: Ruby On Rails

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

Page 91: Ruby On Rails

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!

Page 92: Ruby On Rails

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

Page 93: Ruby On Rails

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

Page 94: Ruby On Rails

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

[email protected]

Obrigado a todos!Obrigado a todos!