Entendendo Rails

  • View
    27

  • Download
    1

Embed Size (px)

DESCRIPTION

Entendendo Rails. Fabio Akita Surgeworks Brazil Rails Practice Manager www.akitaonrails.com. 37signals. Criado por David Heinemeier Hansson, em 2004 Extraído do aplicativo Basecamp Feito em Ruby, em vez de PHP ou Java Lançamento da versão 1.0 em dez/2005. O que é Rails?. - PowerPoint PPT Presentation

Text of Entendendo Rails

  • Entendendo RailsFabio AkitaSurgeworks Brazil Rails Practice Managerwww.akitaonrails.com

  • 37signalsCriado por David Heinemeier Hansson, em 2004

    Extrado do aplicativo Basecamp

    Feito em Ruby, em vez de PHP ou Java

    Lanamento da verso 1.0 em dez/2005

  • O que Rails?full stack web framework

    Framework completo para desenvolvimento de aplicativo Web

    Pacote MVC (Model-View-Controller)Action Pack (Action Controller e Action View)Active Record

    Suporte a envio e recebimento de e-mailsAction Mailer

    Suporte a Web ServicesAction WebServices

  • Arquitetura Rails

  • Por que Ruby?Linguagem DinmicaFortemente TipadaMuito ExpressivaAltamente ProdutivaTotalmente Orientado a ObjetosHerana de SmallTalk e LispSimples sem ser complexaSintaxe familiar e coerentePermite criao de Linguagem Especfica de Domnio (DSL)

  • Comeo SimplesWindows: Instant Railswiki.rubyonrails.com/rails/pages/InstantRails

    Mac e Linux: FiveRuns RB-Installwww.fiveruns.com/products/rm/install

  • Comeo PadroInstalar Ruby 1.8.6www.ruby-lang.org/en/downloads

    Instalar RubyGems (Mac ou Linux)rubyforge.org/frs/?group_id=126

    Instalar Rails (linha de comando)gem install rails

    Instalar MySQL (suporta outros bancos)dev.mysql.com/downloads

  • Primeiro PassoSaber o que queremos:

    David Hansson tem um screencast demonstrando a criao de um pequeno blog em 15 minutoshttp://media.rubyonrails.org/video/rails_take2_with_sound.mov

    Queremos um blog semelhante

  • O Que temos no Blog?Uma tabela de PostsUma tabela associada de CommentsUma tela de listagem de PostsUma tela de criao e edio de PostsUma tela de detalhes do PostNo detalhe do Post vemos e adicionamos Comments

    Faremos tudo em ingls. No difcil adaptar para Portugus, mas no escopo desta demonstrao

  • Novo Projetorails

  • Novo Banco de Dadoscreate database _

  • AmbientesRails vem preparado para lidar com trs ambientes diferentes:

    Development (sandbox)

    Test (testes unitrios, funcionais, integrados)

    Production (produo)

  • Conveno sobre ConfiguraoEstrutura comum de diretrios

  • Configurao MnimaBanco de dadosNo exemplo, apenas colocando as senhas

  • Criando um Controllerscript/generate controller

  • Controllers e ActionsTodo Controller fica no diretrio:/app/controllers/_controller.rb

    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 mtodo de um controller chamado de Action

  • Criando uma ActionUma classe Controller pode ter quantas Actions quanto necessrias

  • Servidor de Teste: WEBRick

  • Roteamento Customizvelhttp://localhost:3000/:controller/:action/:id

  • Acessando uma ActionSeguindo a regra anterior de roteamentohttp://localhost:3000/blog/index

    blog = app/controller/blog_controller.rbindex = mtodo index em BlogController

  • Criando uma View

  • Mais ConvenesAo final de toda Action, Rails chamar uma view com o mesmo nome da Action, no seguinte diretrio:/app/views//.

    A extenso do arquivo pode ser:

    .rhtml - Embedded Ruby (HTML+Ruby).rxml - XML Builder (Ruby puro).rjs - Javascript Generator (Ruby puro)

    Este fluxo pode ser interrompido com uma chamada explcita ao mtodo render ou redirect_to

  • Implementando Postscript/generate model

  • MigrationManuteno de tabelas usando RubyIndependente de bancoMas tambm suporta SQL nativo

  • Rake: Ruby MakeExecuo de tarefas, implementadas em RubyPrimeira tarefa: manuteno das tabelas

  • rake migrateToda entidade criada com script/generate gera um arquivo de Migration no diretrio db/migrate

    Todo arquivo Migration numerado:001_create_posts.rb

    O comando rake migrate executa os arquivos em db/migrate

    Usa a tabela schema_info no banco de dados para saber a partir de qual numerao comear

    O gerenciamento do banco de dados feito totalmente em Ruby

  • Mapeando TabelasA classe Post j capaz de gerenciar os dados da tabela no banco de dadosNo h necessidade de explicitar o mapeamento das colunas do banco com atributos da classeRails no probe nada: se for necessrio existe como mapear uma coluna para outro atributo de nome diferente

  • Convenes de EntidadesToda entidade criada no diretrio padro:/app/models//.rb

    Toda entidade herda diretamente da classe ActiveRecord::Base

    No h necessidade de mapear manualmente cada coluna da tabela

    Conveno: a classe tem o nome no singular (Post), a tabela tem o nome do plural (posts)

    Conveno: Surrogate Key, toda tabela tem uma chave primria chamada id que um nmero auto-incrementvel

  • annotate_models

  • annotate_modelsPlugin de Dave Thomas

    Instalao (via internet):script/plugin install annotate_models

    Utilizao (via rake):rake annotate_models

    L a tabela do banco de dados e coloca um cabealho como comentrio na classe entidade

  • Scaffold

  • ScaffoldColocar o mtodo scaffold : no controller suficiente

    Telas CRUD (Create, Read, Update, Delete) geradas automaticamente em tempo de execuo (runtime)

    CUIDADO: Rails NO Scaffold

    Scaffold apenas uma pequena funcionalidade para facilitar prototipao

  • Configurando PostAcrescentando validao

  • Testando modificaoNo necessrio reiniciar servidor

  • Incrementando PostCriando novas colunas com Migrationscript/generate migration

  • Executando Migration

  • Criando um PostNovamente, sem reiniciar o servidor

  • Gerando o Scaffoldscript/generate scaffold

  • Arquivos GeradosToda execuo automtica de antes agora est exposta em arquivos que podemos editar como quisermosProvado: Rails no se restringe a Scaffold automtico

  • Modificando a Listagem/app/views/blog/list.rhtml

  • Testando a listagemhttp://localhost:3000/blog

    Portanto, podemos alterar o layout ou qualquer cdigo como quisermos

  • Polmica do ScripletRails no utiliza taglibs

    Ruby simples e expressiva o suficiente para no precisar de artifcios

    Taglibs so simplificaes de lgica

    Podemos fazer tudo de maneira simples e flexvel sem precisar aprender sintaxes complexas de XML

  • ExemplosTaglibs

  • Criar CommentHora de criar a entidade CommentLembrete: esta entidade ser associada a um Post

  • Rake outra vezObs: Comment pertence a Post atravs da coluna post_id.Conveno de Chave Estrangeira: _id

  • Associaes

  • Usando associaesCriando formulrio de Comment na tela de detalhe de um Post/app/views/blog/show.rhtml

  • PartialsDont Repeat Yourself (DRY)

    Uma das maneiras de separar trechos de cdigo

    Toda partial comea com underline _ "comment", :collection => @post.comments %>

    Associao has_many em Post automaticamente fornece um hash chamado comments (nome da outra entidade no plural)

  • Action para Comment {:action => 'add_comment', :id => @post } do |f| %>Action esperada: add_commentPassando parmetros: params[:id] e params[:comment]Hash params[:comment] contm todos os campos do formulrio enviado.

  • Resultado FinalTela de Post com a lista de Comments

  • LayoutsTodo novo controller automaticamente ganha um layout no diretrio:/app/views/layouts/.rhtmlAs views desse controller preenchem o espao:

  • Testes UnitriosToda nova entidade ganha um arquivo para teste unitrio em:/app/test/unit/_test.rbDevemos seguir os preceitos de Test-Driven Development:Se no vale a pena testar, para que estamos codificando?

  • Ambiente de TesteOs testes acontecem em banco de dados separado do desenvolvimento_test

    Cada teste roda de maneira isolada: os dados modificados em um teste no afetam outro teste

    Cada teste unitrio tem um arquivo de fixture, carga de dados para testes:/app/test/fixture/.yml

  • Fixture YAMLYAML Aint a Markup LanguageManeira de serializar objetos Ruby em forma de textoFormato humanamente legvelMais leve e simples que XML

  • Rodando Testes UnitriosTodos os testes unitriosrake test:unitsApenas um teste unitrio:ruby test/unit/_test.rb

  • Testes FuncionaisTodo novo controller ganha uma classe de teste em:/app/test/functional/_controller_test.rbDevemos testar cada action do controllerMtodos como get e post simulam navegao com um browser

  • Rodando Testes FuncionaisTodos os testes funcionais:rake test:functionalsApenas um testes funcional:ruby test/functional/_controller_test.rb

  • Mais TestesTestes Unitrios devem testar todos os aspectos da entidade como associaes, validaes, callbacks, etc

    Testes Funcionais devem testar todas as actions de um mesmo controller, todos os fluxos, redirecionamentos, filtros, etc

    Testes Integrados servem para avaliar a navegao e fluxos entre actions de diferentes controllers. Funcionam de maneira semelhante a um teste funcional

  • AjaxRails o melhor modelo de framework para AjaxAjax codificado em Ruby puroIntegrao com as bibliotecas Prototype e Script.aculo.us

    Ajax representa um passo em direo a um Aplicativo WebSem necessidade de recarregar a pgina toda a cada aoCapacidade de atualizar apenas trechos da telaCapacidade de realizar um post (submit) sem sair da pginaCapacidade de receber apenas a informao que precisa ser atualizada em vez de receber a pgina inteira

  • View AjaxfiedManeira simples: apenas trocar form_for para remote_form_for

  • Action Ajaxfiedrequest.xhr? checa se veio chamada via Ajax.