Upload
mauricio-linhares
View
1.641
Download
7
Embed Size (px)
DESCRIPTION
Material do curso de Ruby on Rails.
Citation preview
Por que Rails? } Escrito em Ruby (sim, isso é uma vantagem);
} Baseado em necessidades reais, não em um comitê (JSF, estou olhando pra você);
} Convenção e padrões em vez de configuração;
} Respostas rápidas a alterações feitas em código;
Por que Rails? } Desenvolvido de forma aberta com uma licença
permissiva e business friendly (MIT);
} Comunidade ativa e focada em desenvolvimento web que já produziu plugins e integrações com várias ferramentas comuns;
} Vários livros, muita documentação disponível de forma gratuita e aparição massiva em eventos de desenvolvimento;
De onde vem o Rails? } David Heinemeier Hanson;
} 37 Signals;
} Basecamp;
} Foi lançado em julho de 2004 e a equipe de desenvolvimento começou a ser formada em fevereiro de 2005;
ActiveSupport } Contém classes utilitárias genéricas que são utilizadas por
todo o framework e aplicações escritas com ele;
} Adiciona novas funcionalidades a classes padrão do Ruby, como Array e Hash;
} É dependência obrigatória de qualquer aplicação Rails;
ActiveRecord } Biblioteca de mapeamento objeto/relacional padrão do
Rails;
} Faz a ponte entre o banco de dados relacional e os objetos que permeiam a aplicação;
} Contém a implementação das Migrations que são a forma evolutiva de tratar os bancos de dados trazida pelo Rails;
ActionPack e ActionView } Fazem a ponte entre o navegador web e o código da
aplicação;
} O ActionPack faz a recepção e tratamento de requisições vindas dos clientes, incluindo controle de sessão e autenticação de clientes;
} O ActionView contém as classes utilizadas para gerar saída para os clientes da aplicação web;
MVC - Arquitetura de aplicações Rails
Model - ActiveRecord
Controller - ActionController
View - ActionView
Workflow comum } O Controler recebe uma requisição;
} Transforma os dados da requisição e os repassa para o Model;
} Recebe os resultados do Model e os repassa para a View;
Controller } Rotear requisições para os componentes corretos;
} Transformar os dados da requisição em uma forma aceitável para o modelo;
} Chamar o modelo para executar a lógica nos dados já tratados;
} Entregar o resultado da lógica do modelo para a camada de visualização;
Model } O coração da aplicação, onde vive toda lógica de negócio
da mesma;
} Pode ou não ser representado por objetos ActiveRecord e se comunicar com o banco de dados;
} Também podem ser serviços, objetos que encapsulam uma lógica complexa de negócio ou que falam com outros sistemas;
View } Apresenta as informações para o cliente, que pode ser
um usuário real ou ainda outro sistema;
} Não pode conter lógica de negócio, deve apenas mostrar a informação e ter código relacionado a apresentação dos dados;
} Deve sempre receber os dados prontos do Controller;
Helpers? } São objetos que servem pra ajudar a visualização a
mostrar dados para os clientes;
} Em vez de se utilizar de tags especiais ou poluir a página HTML com código Ruby, ele deve viver nas classes Helper;
} Devem ser utilizadas somente para código relacionado a apresentação de informação;
Escrevendo a migração class CriarProdutos < ActiveRecord::Migration def self.up create_table :produtos do |t| t.string :nome, :null => false t.text :descricao t.decimal :preco, :precision => 10, :scale => 2, :null => false t.timestamps end end def self.down drop_table :produtos end end
Mais parâmetros em um migration } :null – indica se pode ser null ou não (true-false)
} :limit – indica o tamanho máximo do campo
} :default – indica o valor padrão do campo
} :precision – indica a precisão do número
} :scale – indica a escala do número (quantas casas depois da vírgula)
Criando o modelo em app/models/produto.rb
class Produto < ActiveRecord::Base validates_presence_of :nome, :preco validates_numericality_of :preco, :greater_than =>
0, :allow_nil => true end
ActiveRecord::Base } Todas as classes que acessam o banco de dados devem
herdar de ActiveRecord::Base ou de um dos seus descendentes;
} Cada uma das classes deve representar uma tabela no banco de dados;
} Dentro dessa classe ficam definidas as validações e associações com outros objetos;
Criando o controlador – app/controllers/produtos_controller.rb class ProdutosController < ApplicationController def index @produtos = Produto.all respond_to do |format| format.html format.xml do render :xml => @produtos end end end end
Criando um controller } Todos os controllers da aplicação devem herdar de
ApplicationController ou de um dos seus descendentes;
} Produto.all retorna todos os objetos da tabela “produtos”;
} Com o uso de respond_to é possível usar um mesmo código e retornar formatos diferentes;
Roteando requisições para o lugar certo – config/routes.rb
resources :produtos root :to => ’produtos#index'
Definições } root - mapeia a rota raiz da aplicação “/” – é necessário
remover o arquivo “public/index.html”
} match – mapeia uma URL para uma ação ou controller, aceita os parâmetros especiais: } :controller } :action } :format } Além da possibilidade de se definir os seus próprios
parâmetros } match “produtos/:action/:id” => “produtos#:action”
map.resources – REST - Representational State Transfer
} HTTP é um protocolo de troca de documentos ou recursos;
} Os recursos são identificados através de URLs;
} Uma aplicação web é um conjunto navegável de recursos;
rake:routes produtos GET /produtos(.:format)
{:action=>"index", :controller=>"produtos"} POST /produtos(.:format) {:action=>"create", :controller=>"produtos"} new_produto GET /produtos/new(.:format)
{:action=>"new", :controller=>"produtos"} edit_produto GET /produtos/:id/edit(.:format)
{:action=>"edit", :controller=>"produtos"} produto GET /produtos/:id(.:format)
{:action=>"show", :controller=>"produtos"} PUT /produtos/:id(.:format) {:action=>"update", :controller=>"produtos"} DELETE /produtos/:id(.:format) {:action=>"destroy", :controller=>"produtos“}
Os métodos HTTP mais comuns } GET – “pegar” um documento
} POST – enviar dados para o servidor
} DELETE – apagar um documento no servidor
} PUT – atualizar um documento no servidor
Idempotência } Alguns métodos HTTP podem ser chamados várias vezes
para o mesmo recurso sem causar efeitos colaterais ou recebendo sempre a mesma resposta – GET, PUT, DELETE;
} O Método POST não é idempotente, cada chamada vai causar um efeito diferente no servidor e as respostas não vão necessariamente ser as mesmas;
Layout base da aplicação – app/views/layouts/application.html.erb
} É a estrutura base onde as outras páginas da aplicação vão ser inseridas;
} Cada aplicação pode ter mais do que um arquivo de layout, o uso ou não do layout depende da configuração na hora que a página está sendo gerada;