SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
Aprendendo Ruby on Rails – Aula 2


                     Maurício Linhares
Começando a usar Git e GitHub
}    Crie uma conta no GitHub J

}    Na sua máquina, crie uma chave SSH:
      }    ssh-keygen -t rsa -C „seu@email.com“
      }    Não coloque senha, deixe em branco;

}    Vá até https://github.com/account e procure por “SSH
      public keys”;

}    Copie o arquivo “~/.ssh/id_rsa.pub” para o campo no
      GitHub;
Começando a usar Git e GitHub
}    Teste a conexão com “ssh git@github.com”;

}    Crie um repositório pra você com o nome “linuxfi-loja”;

}    Entre dentro da pasta do seu projeto na sua máquina e :
      }    git config --global user.name “Seu Nome“
      }    git config --global user.email “seu@email.com"
      }    git init .
Criando o arquivo .gitignore
}    Dentro da raiz do seu projeto, crie um arquivo chamado
      “.gitignore”;
      }    gedit .gitignore


}    O conteúdo do arquivo deve ser o seguinte:
      }    *.log
      }    *.pid
      }    .idea/*
Preparando para enviar os arquivos
}    Adicionando arquivos ao controle de versão:
      }    git add .
      }    “.” adiciona todos os arquivos, você também pode adicionar os
            arquivos um a um;


}    Aplicando as mudanças ao repoistório:
      }    git commit –m “Código inicial da loja”
      }    “commit” aplica as mudanças e salva todas as alterações
            aplicadas desde o último “commit”
Enviando as alterações para o servidor do
GitHub
}    Adicionando o servidor do GitHub como servidor
      remoto do seu código:
      }    git remote add origin
            git@github.com:usuario-do-github/linuxfi-loja.git


}    Enviando as alterações para o servidor remoto do
      GitHub
      }    git push origin master


}    Para baixar o projeto em outra máquina:
      }    git clone git@github.com:usuario-do-github/linuxfi-loja.git
Workflow do trabalho no GitHub
}    Desenvolva suas alterações;

}    Adicione os arquivos para alteração
      }    git add .

}    Salve as alterações no repositório local:
      }    git commit –m “mensagem”

}    Atualize o seu repositório local com as alterações do
      repositório remoto:
      }    git pull

}    Envie suas alterações para o servidor remoto:
      }    git push
Adicionando as mensagens em pt-BR ao
Rails
}    Configurar no “config/application.rb” para utilizar “pt-BR”
      como língua padrão:
      }    config.i18n.default_locale = :'pt-BR'


}    Baixar o arquivo de I18N de:
      }    http://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/
            pt-BR.yml


}    Salvar o arquivo em “config/locales/pt-BR.yml”;
Preparando o carrinho de compras
}    Os produtos vão ser relacionar com pedidos;

}    Os pedidos não se relacionam diretamente com
      produtos, mas com uma tabela itens, que vai fazer a
      associação entre eles e adicionar atributos ao
      relacionamento, como quantidade;

}    Duas novas entidades surgem, Pedido e Item;
Gerando a migração para pedidos e itens

rails generate migration criar_pedidos_e_itens
Código da migration
def self.up
  create_table :pedidos do |t|
    t.string :estado, :default => 'carrinho', :null => false
    t.timestamps
  end
  create_table :itens do |t|
    t.integer :pedido_id, :null => false
    t.integer :produto_id, :null => false
    t.integer :quantidade
  end
  add_index :itens, :pedido_id
end

def self.down
  drop_table :pedidos
  drop_table :itens
end
Criando a classe Item
class Item < ActiveRecord::Base

 belongs_to :produto
 belongs_to :pedido

 validates_presence_of :produto_id, :pedido_id, :quantidade

end
Detalhes da classe item
}    Itens se associam com produtos e pedidos, a tabela
      “itens” guarda chaves estrangeiras para as duas outras
      tabelas, então o relacionamento é um “belongs_to” para
      cada uma delas;

}    O plural de “item” é “itens” e não “items” como seria no
      inglês, então é necessário configurar o inflector do Rails
      para agir segundo essa regra;
config/inflections.rb


ActiveSupport::Inflector.inflections do |inflect|
 inflect.irregular 'item', 'itens'
end
Criando a classe Pedido
class Pedido < ActiveRecord::Base

 has_many :itens
 has_many :produtos, :through => :items

end
Detalhes da classe Pedido
}    Cada pedido contém vários itens, então há um
      relacionamento “has_many” para a classe “Item”;

}    Com o relacionamento entre Pedido e Item, também é
      necessário saber exatamente quais são os produtos
      relacionados ao pedido, isso é feito através do
      relacionamento “has_many :through” entre as duas
      classes;

}    O “has_many :through” simplifica o acesso a objetos que
      sejam internos a um relacionamento já definido da classe
      em questão;
Adicionando a flash aos layouts
}    A flash é um espaço que existe entre as requisições para
      se guardar informações;

}    Normalmente é utilizada para mostrar mensagens para o
      usuário;

}    Os dados colocados na requisição atual, serão apagados
      ao fim da próxima requisição (depois do redirect);
Mas antes disso – Twitter Bootstrap!
}    Conjunto de folhas de estilo e JavaScript padrões
      desenvolvidos pelo Twitter;

}    Contém vários componentes visuais comuns e que
      podem ser utilizados em várias aplicações;

}    Facilita a estilização das suas páginas através de um CSS
      limpo e bem organizado;

}    http://twitter.github.com/bootstrap/
Adicione ele como dependência no seu
Gemfile
}    gem 'less-rails-bootstrap', '1.3.3’

}    Execute o bundler:
      }    bundle install


}    Adicione ele no seu app/assets/javascripts/application.js:
      }    //= require twitter/bootstrap


}    Adicione ele no seu app/assets/stylesheets/application.css:
      }    *= require twitter/bootstrap
Alterando o app/views/layout/
application.html.erb
<body>

  <div class="container">

   <% [:success, :warning, :error, :info].each do |key| %>
     <% unless flash[key].blank? %>
        <div class="alert-message <%= key %>">
          <a class="close" href="javascript:void(0)">&times;</a>
          <p><strong><%= flash[key] %></strong></p>
        </div>
     <% end %>
   <% end %>

   <%= yield %>
  </div>

</body>
Chamada para fechar o alerta – app/assets/
javascripts/main.js

jQuery( function () {

   jQuery(".alert-message").alert();

} );
Definindo método pedido_atual em
ApplicationController
helper_method :pedido_atual

protected

def pedido_atual
  if @pedido_atual.nil? && !session[:pedido_id].blank?
    @pedido_atual =
 Pedido.find_by_id( session[:pedido_id] )
  end
  @pedido_atual ||= Pedido.new
end
Adicionando itens ao pedido
}    O pedido atual fica guardado na sessão do usuário, o
      método que faz isso é o “pedido_atual” que vai ser
      definido em ApplicationController;

}    O método “pedido_atual” também precisa ficar disponível
      nas páginas da aplicação;

}    A chamada a “helper_method :pedido_atual” faz com que
      o método seja copiado para as visualizações também;
Implementando a adição de produtos em
Item
class Pedido < ActiveRecord::Base

 has_many :itens
 has_many :produtos, :through => :items

 def adicionar_produto(produto, quantidade)

  if item = self.itens.detect { |elemento| elemento.produto == produto }
    item.incrementar_quantidate(quantidade)
    item.save
  else
    self.itens.create(:produto => produto, :quantidade => quantidade)
  end

 end

end
Implementação do incrementar_quantidade
em Item

class Item < ActiveRecord::Base

 belongs_to :produto
 belongs_to :pedido

 validates_presence_of :produto_id, :pedido_id, :quantidade
 validates_numericality_of :quantidade, :greater_than => 0, :allow_nil => true

 def incrementar_quantidade(quantidade)
  self.quantidade += quantidade
 end

end
Implementação da adição de produto no
carrinho no ItensController
class ItensController < ApplicationController

 def create
  pedido_atual.save
  session[:pedido_id] = pedido_atual.id

  pedido_atual.adicionar_produto(Produto.find(params[:produto_id]), params[:quantidade])

  respond_to do |format|
   format.html do
     flash[:success] = 'O produto foi adicionado com sucesso a o seu carrinho'
     redirect_to produtos_path
   end
  end
 end

end
Adicionar rota para o ItensController



resources :itens
Montando o formulário para adição de
produtos ao carrinho

<%= form_tag itens_path, :html => { :method => :post }
 do %>
  <%= hidden_field_tag :produto_id, produto.id %>
  <p>
     <%= text_field_tag :quantidade, 1 %>
     <%= submit_tag 'Adicionar ao carrinho' %>
 </p>
<% end %>
Adicionando link para visualizar o carrinho
no application.html.erb
<div class="topbar-wrapper" style="z-index: 5;">
 <div class="topbar">
  <div class="topbar-inner">
    <div class="container">
     <h3> <%= link_to 'Minha Loja', root_url %> </h3>
     <% unless pedido_atual.itens.blank? %>
         <ul class="nav secondary-nav">
          <li>
           <%= link_to 'Veja o seu carrinho', itens_path %>
          </li>
         </ul>
     <% end %>
    </div>
  </div>
 </div>
</div>
Complementando a classe Item
class Item < ActiveRecord::Base

 # outros métodos aqui

 def preco_unitario
  self.produto.preco
 end

 def nome
  self.produto.nome
 end

 def preco_total
  self.produto.preco * self.quantidade
 end

end
Porque preco_unitario e nome
implementados em Item?
}    Referência a Lei de Demeter (deusa grega da Agricultura)
      ou o princípio do menor conhecimento;

}    Objetos devem falar somente com suas dependências
      diretas (variáveis de instância ou objetos recebidos como
      parâmetro);

}    Fazer com que um objeto dependa somente de outros
      objetos que estejam no mesmo “grupo” que ele;
Complementando a classe Pedido
class Pedido < ActiveRecord::Base

 # outros métodos

 def preco_total
  self.itens.inject( 0 ) do |acumulado, item|
   acumulado+ item.preco_total
  end
 end

end
Cabeçalho do carrinho de compras
<thead>
   <tr>
     <th>Produto</th>
     <th>Quantidade</th>
     <th>Preço Unitário</th>
     <th>Preço Total</th>
   </tr>
</thead>
Tabela principal do carrinho de compras
<table>
<tbody>
    <% pedido_atual.itens.each do |item| %>
     <tr>
       <td> <%= item.nome %> </td>
       <td> <%= item.quantidade %> </td>
       <td> <%= number_to_currency item.preco_unitario %></td>
       <td> <%= number_to_currency item.preco_total %> </td>
     </tr>
    <% end %>
 </tbody>
</table>
Rodapé do carrinho de compras
<tfoot>
   <tr>
     <td colspan="2"></td>
     <td> Preço Total </td>
     <td> <%= number_to_currency
 pedido_atual.preco_total %> </td>
   </tr>
  </tfoot>

Mais conteúdo relacionado

Destaque

Segurança & Ruby on Rails
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on RailsJulio Monteiro
 
Como colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubJulio Monteiro
 
Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Julio Monteiro
 
Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)Julio Monteiro
 
Por que Ruby on Rails?
Por que Ruby on Rails?Por que Ruby on Rails?
Por que Ruby on Rails?Julio Monteiro
 

Destaque (6)

Segurança & Ruby on Rails
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on Rails
 
Como colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHub
 
Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)
 
Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)
 
Por que Ruby on Rails?
Por que Ruby on Rails?Por que Ruby on Rails?
Por que Ruby on Rails?
 

Semelhante a Curso de Ruby on Rails - Aula 02

Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Maurício Linhares
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareAldson Diego
 
Comunidades Baseadas Em Subsites
Comunidades Baseadas Em SubsitesComunidades Baseadas Em Subsites
Comunidades Baseadas Em Subsitesalessandrolandim
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Pythonantonio sérgio nogueira
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyantonio sérgio nogueira
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIRudá Almeida
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Saulo Vallory
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPressLeandrinho Vieira
 
Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Thyago Maia
 
Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Maurício Linhares
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojofabioginzel
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateVitor Silva
 
Desenvolvimento de plugins WordPress
Desenvolvimento de plugins WordPressDesenvolvimento de plugins WordPress
Desenvolvimento de plugins WordPressLeandrinho Vieira
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPMarcelo Andrade
 

Semelhante a Curso de Ruby on Rails - Aula 02 (20)

Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de Software
 
Comunidades Baseadas Em Subsites
Comunidades Baseadas Em SubsitesComunidades Baseadas Em Subsites
Comunidades Baseadas Em Subsites
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Python
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0
 
Python 08
Python 08Python 08
Python 08
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPress
 
Python 07
Python 07Python 07
Python 07
 
Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3
 
My first app django
My first app djangoMy first app django
My first app django
 
Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojo
 
Vraptor
VraptorVraptor
Vraptor
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernate
 
Desenvolvimento de plugins WordPress
Desenvolvimento de plugins WordPressDesenvolvimento de plugins WordPress
Desenvolvimento de plugins WordPress
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 

Mais de Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 
Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Maurício Linhares
 

Mais de Maurício Linhares (20)

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 
Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010
 

Curso de Ruby on Rails - Aula 02

  • 1. Aprendendo Ruby on Rails – Aula 2 Maurício Linhares
  • 2. Começando a usar Git e GitHub }  Crie uma conta no GitHub J }  Na sua máquina, crie uma chave SSH: }  ssh-keygen -t rsa -C „seu@email.com“ }  Não coloque senha, deixe em branco; }  Vá até https://github.com/account e procure por “SSH public keys”; }  Copie o arquivo “~/.ssh/id_rsa.pub” para o campo no GitHub;
  • 3. Começando a usar Git e GitHub }  Teste a conexão com “ssh git@github.com”; }  Crie um repositório pra você com o nome “linuxfi-loja”; }  Entre dentro da pasta do seu projeto na sua máquina e : }  git config --global user.name “Seu Nome“ }  git config --global user.email “seu@email.com" }  git init .
  • 4. Criando o arquivo .gitignore }  Dentro da raiz do seu projeto, crie um arquivo chamado “.gitignore”; }  gedit .gitignore }  O conteúdo do arquivo deve ser o seguinte: }  *.log }  *.pid }  .idea/*
  • 5. Preparando para enviar os arquivos }  Adicionando arquivos ao controle de versão: }  git add . }  “.” adiciona todos os arquivos, você também pode adicionar os arquivos um a um; }  Aplicando as mudanças ao repoistório: }  git commit –m “Código inicial da loja” }  “commit” aplica as mudanças e salva todas as alterações aplicadas desde o último “commit”
  • 6. Enviando as alterações para o servidor do GitHub }  Adicionando o servidor do GitHub como servidor remoto do seu código: }  git remote add origin git@github.com:usuario-do-github/linuxfi-loja.git }  Enviando as alterações para o servidor remoto do GitHub }  git push origin master }  Para baixar o projeto em outra máquina: }  git clone git@github.com:usuario-do-github/linuxfi-loja.git
  • 7. Workflow do trabalho no GitHub }  Desenvolva suas alterações; }  Adicione os arquivos para alteração }  git add . }  Salve as alterações no repositório local: }  git commit –m “mensagem” }  Atualize o seu repositório local com as alterações do repositório remoto: }  git pull }  Envie suas alterações para o servidor remoto: }  git push
  • 8. Adicionando as mensagens em pt-BR ao Rails }  Configurar no “config/application.rb” para utilizar “pt-BR” como língua padrão: }  config.i18n.default_locale = :'pt-BR' }  Baixar o arquivo de I18N de: }  http://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ pt-BR.yml }  Salvar o arquivo em “config/locales/pt-BR.yml”;
  • 9. Preparando o carrinho de compras }  Os produtos vão ser relacionar com pedidos; }  Os pedidos não se relacionam diretamente com produtos, mas com uma tabela itens, que vai fazer a associação entre eles e adicionar atributos ao relacionamento, como quantidade; }  Duas novas entidades surgem, Pedido e Item;
  • 10. Gerando a migração para pedidos e itens rails generate migration criar_pedidos_e_itens
  • 11. Código da migration def self.up create_table :pedidos do |t| t.string :estado, :default => 'carrinho', :null => false t.timestamps end create_table :itens do |t| t.integer :pedido_id, :null => false t.integer :produto_id, :null => false t.integer :quantidade end add_index :itens, :pedido_id end def self.down drop_table :pedidos drop_table :itens end
  • 12. Criando a classe Item class Item < ActiveRecord::Base belongs_to :produto belongs_to :pedido validates_presence_of :produto_id, :pedido_id, :quantidade end
  • 13. Detalhes da classe item }  Itens se associam com produtos e pedidos, a tabela “itens” guarda chaves estrangeiras para as duas outras tabelas, então o relacionamento é um “belongs_to” para cada uma delas; }  O plural de “item” é “itens” e não “items” como seria no inglês, então é necessário configurar o inflector do Rails para agir segundo essa regra;
  • 15. Criando a classe Pedido class Pedido < ActiveRecord::Base has_many :itens has_many :produtos, :through => :items end
  • 16. Detalhes da classe Pedido }  Cada pedido contém vários itens, então há um relacionamento “has_many” para a classe “Item”; }  Com o relacionamento entre Pedido e Item, também é necessário saber exatamente quais são os produtos relacionados ao pedido, isso é feito através do relacionamento “has_many :through” entre as duas classes; }  O “has_many :through” simplifica o acesso a objetos que sejam internos a um relacionamento já definido da classe em questão;
  • 17. Adicionando a flash aos layouts }  A flash é um espaço que existe entre as requisições para se guardar informações; }  Normalmente é utilizada para mostrar mensagens para o usuário; }  Os dados colocados na requisição atual, serão apagados ao fim da próxima requisição (depois do redirect);
  • 18. Mas antes disso – Twitter Bootstrap! }  Conjunto de folhas de estilo e JavaScript padrões desenvolvidos pelo Twitter; }  Contém vários componentes visuais comuns e que podem ser utilizados em várias aplicações; }  Facilita a estilização das suas páginas através de um CSS limpo e bem organizado; }  http://twitter.github.com/bootstrap/
  • 19. Adicione ele como dependência no seu Gemfile }  gem 'less-rails-bootstrap', '1.3.3’ }  Execute o bundler: }  bundle install }  Adicione ele no seu app/assets/javascripts/application.js: }  //= require twitter/bootstrap }  Adicione ele no seu app/assets/stylesheets/application.css: }  *= require twitter/bootstrap
  • 20. Alterando o app/views/layout/ application.html.erb <body> <div class="container"> <% [:success, :warning, :error, :info].each do |key| %> <% unless flash[key].blank? %> <div class="alert-message <%= key %>"> <a class="close" href="javascript:void(0)">&times;</a> <p><strong><%= flash[key] %></strong></p> </div> <% end %> <% end %> <%= yield %> </div> </body>
  • 21. Chamada para fechar o alerta – app/assets/ javascripts/main.js jQuery( function () { jQuery(".alert-message").alert(); } );
  • 22. Definindo método pedido_atual em ApplicationController helper_method :pedido_atual protected def pedido_atual if @pedido_atual.nil? && !session[:pedido_id].blank? @pedido_atual = Pedido.find_by_id( session[:pedido_id] ) end @pedido_atual ||= Pedido.new end
  • 23. Adicionando itens ao pedido }  O pedido atual fica guardado na sessão do usuário, o método que faz isso é o “pedido_atual” que vai ser definido em ApplicationController; }  O método “pedido_atual” também precisa ficar disponível nas páginas da aplicação; }  A chamada a “helper_method :pedido_atual” faz com que o método seja copiado para as visualizações também;
  • 24. Implementando a adição de produtos em Item class Pedido < ActiveRecord::Base has_many :itens has_many :produtos, :through => :items def adicionar_produto(produto, quantidade) if item = self.itens.detect { |elemento| elemento.produto == produto } item.incrementar_quantidate(quantidade) item.save else self.itens.create(:produto => produto, :quantidade => quantidade) end end end
  • 25. Implementação do incrementar_quantidade em Item class Item < ActiveRecord::Base belongs_to :produto belongs_to :pedido validates_presence_of :produto_id, :pedido_id, :quantidade validates_numericality_of :quantidade, :greater_than => 0, :allow_nil => true def incrementar_quantidade(quantidade) self.quantidade += quantidade end end
  • 26. Implementação da adição de produto no carrinho no ItensController class ItensController < ApplicationController def create pedido_atual.save session[:pedido_id] = pedido_atual.id pedido_atual.adicionar_produto(Produto.find(params[:produto_id]), params[:quantidade]) respond_to do |format| format.html do flash[:success] = 'O produto foi adicionado com sucesso a o seu carrinho' redirect_to produtos_path end end end end
  • 27. Adicionar rota para o ItensController resources :itens
  • 28. Montando o formulário para adição de produtos ao carrinho <%= form_tag itens_path, :html => { :method => :post } do %> <%= hidden_field_tag :produto_id, produto.id %> <p> <%= text_field_tag :quantidade, 1 %> <%= submit_tag 'Adicionar ao carrinho' %> </p> <% end %>
  • 29. Adicionando link para visualizar o carrinho no application.html.erb <div class="topbar-wrapper" style="z-index: 5;"> <div class="topbar"> <div class="topbar-inner"> <div class="container"> <h3> <%= link_to 'Minha Loja', root_url %> </h3> <% unless pedido_atual.itens.blank? %> <ul class="nav secondary-nav"> <li> <%= link_to 'Veja o seu carrinho', itens_path %> </li> </ul> <% end %> </div> </div> </div> </div>
  • 30. Complementando a classe Item class Item < ActiveRecord::Base # outros métodos aqui def preco_unitario self.produto.preco end def nome self.produto.nome end def preco_total self.produto.preco * self.quantidade end end
  • 31. Porque preco_unitario e nome implementados em Item? }  Referência a Lei de Demeter (deusa grega da Agricultura) ou o princípio do menor conhecimento; }  Objetos devem falar somente com suas dependências diretas (variáveis de instância ou objetos recebidos como parâmetro); }  Fazer com que um objeto dependa somente de outros objetos que estejam no mesmo “grupo” que ele;
  • 32. Complementando a classe Pedido class Pedido < ActiveRecord::Base # outros métodos def preco_total self.itens.inject( 0 ) do |acumulado, item| acumulado+ item.preco_total end end end
  • 33. Cabeçalho do carrinho de compras <thead> <tr> <th>Produto</th> <th>Quantidade</th> <th>Preço Unitário</th> <th>Preço Total</th> </tr> </thead>
  • 34. Tabela principal do carrinho de compras <table> <tbody> <% pedido_atual.itens.each do |item| %> <tr> <td> <%= item.nome %> </td> <td> <%= item.quantidade %> </td> <td> <%= number_to_currency item.preco_unitario %></td> <td> <%= number_to_currency item.preco_total %> </td> </tr> <% end %> </tbody> </table>
  • 35. Rodapé do carrinho de compras <tfoot> <tr> <td colspan="2"></td> <td> Preço Total </td> <td> <%= number_to_currency pedido_atual.preco_total %> </td> </tr> </tfoot>