rails na prática

57
RAILS NA PRÁTICA 3 e 5 de Outubro [email protected] marcoafilho @marcoafilho

Upload: marco-antonio-filho

Post on 24-Jan-2015

1.180 views

Category:

Technology


4 download

DESCRIPTION

Treinamento de Ruby on Rails realizado na Universidade Federal da Bahia para a SEMCOMP de 2012. O treinamento tem tempo estimado de 4 horas e apresenta para o aspirante a desenvolvedor Rails alguns dos pontos fortes para desenvolvimento de plataformas nesse framework. São trabalhadas nessa apresentação a criação de scaffolds, das três camadas MVC, da estilização através do Twitter Bootstrap e de como estender a camada lógica.

TRANSCRIPT

Page 1: Rails na prática

RAILS NA PRÁTICA 3 e 5 de Outubro

[email protected]

marcoafilho

@marcoafilho

Page 2: Rails na prática

LICENÇA

Page 3: Rails na prática

MARCO ANTONIO FILHO

COORDENADOR DE TI INPACT.ME

Page 4: Rails na prática

Rails? #Framework

#Ruby

#DesenvolvimentoWeb

#MVC

#DRY

#ConvencaoSobreConfiguracao

#REST

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 5: Rails na prática

Rails?

“#Framework implementado em #Ruby para

#DesenvolvimentoWeb seguindo a arquitetura #MVC e tem como filosofia as seguintes práticas: #DRY, #ConvencaoSobreConfiguracao, #REST.”

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 6: Rails na prática

Ruby #  1.  Tudo  eh  um  objeto  5.times  {  print  "Hello  World!"  }    #  2.  Blocos    sample_array.each  {  |element|  print  element  }    #  3.  Retorno  de  funcao  implicito    def  sum(a,b)      a  +  b  end    #  4.  Tudo  eh  aberto    class  Fixnum      def  previous          self  –  1      end  end  6.previous      #  5.  Operadores  unarios.  Nao  ha  ++,  -­‐-­‐;  Use  +=  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 7: Rails na prática

Ruby #  6.  Atribuicao  paralela  a,  b  =  b,  a    #  7.  Cada  string  é  um  objeto  print  "hello".object_id  print  "hello".object_id  #  Um  novo  objeto    #  8.  Verdadeiro  e  falso  em  Ruby  if  0      print  "Hello  World"  end    #  9.  Suporte  a  faixa  de  numeros  e  expressoes  regulares  de  forma  nativa  (1..10).each  {  print  "Hello  World"  }    #  10.  Indicadores  de  metodo  class  Woman      def  loves?(thing)          thing  ==  "chocolate"  ?  true  :  false      end  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 8: Rails na prática

MVC

MODEL

DATABASE

VIEW CONTROLLER 4. RESPONSE

1. REQUEST

2. DEMAND

3. DATA

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 9: Rails na prática

MÃOS À OBRA  

Page 10: Rails na prática

OBJETIVO

Desenvolver uma plataforma para gerenciamento de finanças pessoais.

A aplicacão

FUNCIONALIDADES

Manutenção de contas (Corrente, Poupança, Carteira); Manutenção de gastos; Relatórios.

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 11: Rails na prática

Wireframes #What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 12: Rails na prática

Wireframes #What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 13: Rails na prática

Configuração

Abra o terminal e digite:

Criando Uma Aplicação Rails Configuração

Ruby 1.9.3 Rails 3.2.8 Git 1.7.4.x

$  rails  new  my_budget  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 14: Rails na prática

Estrutura de diretórios #What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 15: Rails na prática

Git

Preparando para implantar Gemfile group  :development,  :test  do      gem  'sqlite3'  end    group  :production  do      gem  'pg'  end  

$  git  config  -­‐-­‐global  config.name  "Marco  Antonio"  $  git  config  -­‐-­‐global  config.email  "[email protected]"  $  git  init  $  git  add  .  $  git  commit  -­‐m  "Meu  primeiro  commit."  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 16: Rails na prática

2. Configure o heroku com a sua aplicação

Dentro da pasta do seu projeto:

Heroku 1. Crie uma conta em heroku.com

$  gem  install  heroku    $  ssh  keygen  -­‐t  rsa  $  heroku  login  $  heroku  keys:add  $  heroku  create  -­‐-­‐stack  cedar  $  git  push  heroku  master  $  heroku  open  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 17: Rails na prática

Editando o html

Uma página é criada em app/views/pages/home

Página inicial Criando um controle para abarcar páginas

$  rails  g  controller  Pages  home  

<img  alt="Welcome  picture"  src="/assets/welcome.png">  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 18: Rails na prática

Página inicial Visualizando alterações localmente

Execute o comando a seguir e acesse http://localhost:3000

$  rails  s  

Alterando as rotas

Entre no arquivo config/routes.rb e adicione a seguinte linha:

root  to:  "pages#home"  

Remova a public/index.html e reinicie o servidor caso seja necessário.

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 19: Rails na prática

Publicando as alterações $  git  rm  public/index.html  $  git  add  .  $  git  commit  -­‐m  "Nova  home  page."  $  git  push  heroku  master  $  heroku  open  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 20: Rails na prática

CRUD de contas Definindo um modelo de contas

$  rails  g  scaffold  Account  name:string  model:string  

Compondo o bando de dados

$  rake  db:migrate  

Acesse a rota http://localhost:3000/accounts e veja o reultado final

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 21: Rails na prática

O que aconteceu?

$  git  add  .  $  git  commit  -­‐m  "Pagina  de  gerenciamento  de  contas."  $  git  push  heroku  master  $  heroku  run  rake  db:migrate  $  heroku  open  

Rails gerou automaticamente as 3 camadas do MVC

-  Um arquivo de migração que descreve a nova tabela no banco de dados; -  Um modelo Account que interage com o banco de dados; -  Um controlador AccountsController que liga o modelo Account a ações; -  5 páginas que representam algumas ações básicas como listagem e edição; -  Folhas de estilo e um javascripts; -  Alguns arquivos para escrever testes;

Publicando as rotas

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 22: Rails na prática

Entendendo a mágica Migrations

Alterações na estrutura do banco de dados: Abra o arquivo db/migrate/[timestamp]_create_accounts.rb

class  CreateAccounts  <  ActiveRecord::Migration      def  change          create_table  :accounts  do  |t|              t.string  :name              t.string  :model                t.timestamps          end      end  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 23: Rails na prática

Entendendo a mágica Models

Em sua maior parte são representações de tabelas no banco em objetos Ruby; Abra o arquivo app/models/account.rb

class  Account  <  ActiveRecord::Base      attr_accessible  :model,  :name  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 24: Rails na prática

Entendendo a mágica Controllers

Representam ações que podem ser feitas usando modelos ou não; Veja o arquivo app/controllers/accounts_controller.rb

class  AccountsController  <  ApplicationController      def  index          @accounts  =  Account.all            respond_to  do  |format|              format.html  #  index.html.erb              format.json  {  render  json:  @accounts  }          end      end      ...  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 25: Rails na prática

Entendendo a mágica Views

Representam ações que podem ser feitas usando modelos ou não; Veja o arquivo app/views/index.html.erb

<%  @accounts.each  do  |account|  %>      <tr>          <td><%=  account.name  %></td>          <td><%=  account.model  %></td>          <td><%=  link_to  'Show',  account  %></td>          <td><%=  link_to  'Edit',  edit_account_path(account)  %></td>          <td><%=  link_to  'Destroy',  account,  method:  :delete,  data:  {  confirm:  'Are  you  sure?'  }  %></td>      </tr>  <%  end  %>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 26: Rails na prática

Entendendo a mágica Routes

Definem url a partir de ações de controladores; O comando resources cria as rotas para as ações Restful de um controlador; Abra o arquivo config/routes.rb

MyBudgetTraining::Application.routes.draw  do      resources  :accounts        root  to:  "pages#home"  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 27: Rails na prática

DANDO VIDA À APLICAÇÃO  

Page 28: Rails na prática

Twitter Bootstrap #What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 29: Rails na prática

Twitter Bootstrap Rails Inserindo a gem na aplicação

Vá no arquivo Gemfile e adicione:

gem  'twitter-­‐bootstrap-­‐rails',  '2.1.3'  

$  bundle  install  $  rails  g  bootstrap:install  $  rails  g  bootstrap:layout  application  fixed  $  rails  g  bootstrap:themed  Accounts  

Instalando e usando a gem

Remova os comandos favicon_link_tag do arquivo layouts/application.html.erb

Para saber mais, verifique a documentação do twitter bootstrap

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 30: Rails na prática

Publique mais uma vez Envie sua aplicação para o heroku

$  git  add  .  $  git  commit  -­‐m  "Template  usando  twitter  bootstrap."  $  git  push  heroku  master  $  heroku  open  

Porque estamos fazendo isso?

A entrega contínua é uma prática de desenvolvimento ágil (XP)

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 31: Rails na prática

APROFUNDANDO UM POUCO MAIS  

Page 32: Rails na prática

Gerenciamento de transações Model

$  rails  g  model  Transaction  account:references  \      >  description:string  value:decimal  performed_at:datetime  \  >  kind:string  

Execute a nova migration

A entrega contínua é uma prática de desenvolvimento ágil (XP)

$  rake  db:migrate  

Importante!

No arquivo models/transaction.rb adicione como attr_accessible o valor :account_id

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 33: Rails na prática

Gerenciamento de transações Controllers

$  rails  g  controller  Transactions  

Adicione ações ao controller

Adicionaremos sete ações ao controller index, show, new, create, edit, update, destroy; class  TransactionsController  <  ApplicationController      def  index                end  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 34: Rails na prática

Gerenciamento de transações Ação index

Representa uma listagem do modelo

def  index      @transactions  =  Transaction.all          end  

Ação show

Representa uma nova instância de um modelo para apresentação

def  show      @transaction  =  Transaction.find(params[:id])  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 35: Rails na prática

Gerenciamento de transações Ação new

Representa uma nova instância de um modelo

def  new      @transaction  =  Transaction.new          end  

Ação edit

Representa uma instância de um modelo existente para ser modificada

def  edit      @transaction  =  Transaction.find(params[:id])          end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 36: Rails na prática

Gerenciamento de transações Ação create

Cria um objeto no banco

def  create      @transaction  =  Transaction.new(params[:transaction])        if  @transaction.save              redirect_to  @transaction,  notice:  "Transaction  created"      else              render  action:  "new"      end              end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 37: Rails na prática

Gerenciamento de transações Ação update

Atualiza um objeto no banco

def  update      @transaction  =  Transaction.find(params[:id])        if  @transaction.update_attributes(params[:transaction])              redirect_to  @transaction,  notice:  "Transaction  updated"      else              render  action:  "edit"      end              end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 38: Rails na prática

Gerenciamento de transações Ação destroy

Elimina um objeto do banco de dados

def  destroy      @transaction  =  Transaction.find(params[:id])      @transaction.destroy        redirect_to  transactions_path  end  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 39: Rails na prática

Gerenciamento de transações Rotas

Adicionaremos uma rota para os recursos do controle transação

MyBudgetTraining::Application.routes.draw  do      resources  :accounts      resources  :transactions        root  to:  "pages#home"  end  

Agora temos o mesmo conjunto de endereços que temos em contas; Precisamos da camada de visualização!

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 40: Rails na prática

Gerenciamento de transações Views

-  São páginas html com ruby embutido (erb); -  Rails não provê nenhum gerador para criação de views; -  Crie manualmente na pasta views/transactions os arquivos:

-  index.html.erb; -  show.html.erb; -  new.html.erb; -  edit.html.erb; -  _form.html.erb;

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 41: Rails na prática

<%  #index.html.erb  %>    <div  class="page-­‐header"><h1>Transações</h1></div>  <table  class="table  table-­‐striped">      <thead>          <tr>  

   <td>Descrição</td>              <td>...</td>          </tr>      </thead>      <tbody>          <%  @transactions.each  do  |transaction|  %>          <tr>              <td><%=  link_to  transaction.description,  transaction  %></td>              <td>...</td>              <td><%=  link_to  'Editar',  edit_transaction_path(transaction),  class:  "btn  btn-­‐mini"  %></td>              <td><%=  link_to  'Remover',  transaction_path(transaction),  method:  :delete,  data:  {  confirm:  "Tem  certeza?"  },  class:  "btn  btn-­‐mini  btn-­‐danger"  %></td>          </tr>          <%  end  %>      </tbody>  </table>  <%=  link_to  'Nova',  new_transaction_path,  class:  "btn  btn-­‐primary"  %>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 42: Rails na prática

<%  #show.html.erb  %>    <div  class="page-­‐header"><h1>Transação</h1></div>    <dl  class="dl-­‐horizontal">      <dt><strong>Conta:</strong></dt>      <dd><%=  @transaction.account.name  %></dd>      <dt><strong>Descrição:</strong></dt>      <dd><%=  @transaction.description  %></dd>      <dt><strong>Valor:</strong></dt>      <dd><%=  @transaction.value  %></dd>      <dt><strong>Efetuado  em:</strong></dt>      <dd><%=  @transaction.performed_at  %></dd>      <dt><strong>Tipo:</strong></dt>      <dd><%=  @transaction.kind  %></dd>  </dl>    <div  class="form-­‐actions">      <%=  link_to  'Retornar',  transactions_path,  class:  'btn'  %>      <%=  link_to  'Editar',  edit_transaction_path(@transaction),  class:  'btn'  %>      <%=  link_to  'Remover',  transaction_path(@transaction),  method:  :delete,                              data:  {  confirm:  'Tem  certeza?'  },  class:  'btn  btn-­‐danger'  %>  </div>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 43: Rails na prática

<%  #new.html.erb  %>    <div  class="page-­‐header"><h1>Nova  transação</h1></div>  <%=  render  'form'  %>  

<%  #edit.html.erb  %>    <div  class="page-­‐header"><h1>Editar  transação</h1></div>  <%=  render  'form'  %>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 44: Rails na prática

<%  #_form.html.erb  %>    <%=  form_for  @transaction,  html:  {  class:  'form-­‐horizontal'  }  do  |f|  %>      <div  class="control-­‐group">          <%=  f.label  :account_id,  class:  'control-­‐label'  %>          <div  class="controls">              <%=  f.select  :account_id,  Account.all.map{  |a|  [a.name,  a.id]  },                                                                    class:  'number_field'  %>          </div>      </div>      <div  class="control-­‐group">          <%=  f.label  :description,  class:  'control-­‐label'  %>          <div  class="controls"><%=  f.text_field  :description,  class:  'text_field'  %></div>      </div>      ...      <div  class="control-­‐group">          <%=  f.label  :performed_at,  class:  'control-­‐label'  %>          <div  class="controls">              <%=  f.date_select  :performed_at,  class:  'datetime_select'  %>          </div>      </div>      <div  class="form-­‐actions">          <%=  f.submit  'Salvar',  class:  'btn  btn-­‐primary'  %>          <%=  link_to  'Cancelar',  transactions_path,  class:  'btn'  %>      </div>  <%  end  %>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 45: Rails na prática

Layout da aplicação De onde vem o menu e a barra lateral?

Da pasta views/layouts/application.html.erb

Substitua os links da ul.nav pelos seguintes comandos:

<%=  link_to  "Contas",  accounts_path  %>  <%=  link_to  "Transações",  transactions_path  %>  

No wireframe não há uma barra lateral;

Remova a div.span3 e todo o seu conteúdo Clicar no logo MyBudget deveria levar para home

<%=  link_to  "MyBudget",  root_path,  class:  "Brand"  %>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 46: Rails na prática

Publique as alterações Navegue localmente e verifique se tudo está certo

E execute o velho código para publicar

$  git  add  .  $  git  commit  -­‐m  "Pagina  de  gerenciamento  de  transacoes."  $  git  push  heroku  master  $  heroku  run  rake  db:migrate  $  heroku  open  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 47: Rails na prática

ADICIONANDO UM POUCO DE LÓGICA  

Page 48: Rails na prática

Relacionamento de objetos Uma conta tem muitas transações...

Se formos à classe models/transaction.rb vemos a seguinte linha

belongs_to  :account  

Devemos agora adicionar o inverso na classe models/account.rb

has_many  :transactions  

Isso fornecerá uma série de métodos para manipular transações a partir de uma conta Observe o uso do plural no segundo comando

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 49: Rails na prática

Apresentando o total da conta Uma conta tem muitas transações...

Vá até a classe models/account.rb vemos a seguinte linha def  current_amount      transactions.where(kind:  "Income").sum(:value)  -­‐        transactions.where(kind:  "Expense").sum(:value)    end  

Precisamos apresentar essa informação agora na listagem e na visualização

<%  #views/accounts/index.html.erb  %>  <td><%=  account.current_amount  %></td>  

<%  #views/accounts/show.html.erb  %>  <dt>Total</dt>  <dd><%=  @account.current_amount  %></dd>  

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 50: Rails na prática

Restrigindo os gastos por tipo Uma transação pode ser uma saída ou uma entrada

Vá até a classe models/transaction.rb e adicione a constante

TYPES  =  ["Income",  "Expense"]  

E no arquivo views/transactions/_form.html.erb substitua:

<%=  f.text_field  :kind,  class:  'text_field'  %>  

<%=  f.select  :kind,  Transaction::TYPES  %>  

Por

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 51: Rails na prática

NÃO PARE POR AÍ  

Page 52: Rails na prática

Exercícios Aplicação:

-  Use páginação com o plugin will_paginate: http://goo.gl/c3OGx -  Estilize com bootstrap-will_paginate: http://goo.gl/XZUy8

Visualização de contas (show) -  Apresente uma paginação para as últimas 5 transações; -  Ordene as transações por data;

Relatórios

-  Crie uma página de relatórios em que deve ser apresentado as despesas por dia e mês; -  Integre com o Google Charts: http://goo.gl/7bWlQ

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 53: Rails na prática

Gems Anotar

Annotate Models (https://github.com/ctran/annotate_models) Template

Haml e Haml-rails (https://github.com/indirect/haml-rails) Autenticação

Devise (https://github.com/plataformatec/devise) Testes

Rspec (https://github.com/dchelimsky/rspec) Capybara (https://github.com/jnicklas/capybara) Factory Girl (https://github.com/thoughtbot/factory_girl_rails)

Upload de arquivos Carrierwave (https://github.com/jnicklas/carrierwave)

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 54: Rails na prática

Editores de texto Multiplataforma

Sublime Text 2 (http://www.sublimetext.com/2) Vim (http://www.vim.org/) Aptana (http://www.aptana.com/)

MAC OS X Textmate (http://macromates.com/)

LINUX Komodo Edit (http://www.activestate.com/komodo-edit)

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 55: Rails na prática

Referências Livros

Learn To Program (http://pine.fm/LearnToProgram/) Rails Tutorial (http://ruby.railstutorial.org/) Rails guides (http://guides.rubyonrails.org/)

Documentação Rails API (http://api.rubyonrails.org/)

Vídeos Railscasts (http://railscasts.com/) An Introduction to Rails (http://goo.gl/HA5Np)

Tutorial dinâmico Code School (http://www.codeschool.com/) Ruby Weekly (http://rubyweekly.com/)

#What? #FirstSteps #Bootstrapping #Mastering #Logic #KeepWalking

Page 56: Rails na prática

Dúvidas

? ?

? ?

?

? ?

?

? ?

? ?

Page 57: Rails na prática

MUITO OBRIGADO!

[email protected]

marcoafilho

@marcoafilho