









































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Uma apostila sobre Ruby, essa nova linguagem de programação que está crescendo e tomando espaço no mercado de trabalho hoje em dia.
Tipologia: Notas de estudo
1 / 81
Esta página não é visível na pré-visualização
Não perca as partes importantes!










































































O modelo È respons·vel por manter o estado da aplicaÁ„o. Algumas vezes o estado È transiente, durando apenas algumas simples interaÁıes com o usu·rio. Algumas vezes o estado È permanente e ser· armazenado fora da aplicaÁ„o, em um banco de dados, por exemplo.
O modelo È mais do que dados, assegura que todas as regras de negÛcio ser„o aplicadas a esses dados. Por exemplo, se um desconto n„o pode ser aplicado aos pedidos com valores menores que R$ 20,00, o modelo dever· encarrega-se de aplicar essa restriÁ„o. Colocando essa regra de negÛcio no modelo, podemos garantir que nenhuma parte da aplicaÁ„o possa invalidar o dado. O modelo age como um porteiro e um armazenador de dados.
A vis„o È respons·vel por gerar uma interface com o usu·rio, normalmente baseado em dados lidos do modelo, mas nem sempre. Por exemplo, uma loja on-line possui uma lista de produtos cadastrados que necessita ser exibido na tela do usu·rio. A lista ser· montada via modelo, mas ser· a vis„o respons·vel por formatar os dados e mostrar para o usu·rio. Embora essa formataÁ„o possa ser realizada de qualquer forma, a vis„o nunca manipula os dados, ou seja, a camada de vis„o n„o pode alterar o preÁo do produto nem alterar o estoque, por exemplo.
O controlador (ìcontrolerî), como o prÛprio nome sugere, controla a aplicaÁ„o. … um intermedi·rio entre a vis„o e o modelo. Recebe dados do mundo externo(requisiÁıes do usu·rio), interage com o modelo e mostra uma vis„o apropriada para o usu·rio.
A figura abaixo, reforÁa a idÈia do funcionamento desses trÍs elementos que compıe o MVC :
O Ruby on Rails È uma framework MVC. Ela garante que essas trÍs unidades trabalhem juntas enquanto a aplicaÁ„o est· rodando. Uma das grandes vantagens do Rails È que o seu funcionamento È baseado no uso de ìpadrıes inteligentesî, evitando,
A grande vantagem de uma framework, como o Rails, reside no fato de que toda a infra-estrutura È criada automaticamente. Ficando a cargo do programador lidar somente com o mais importante: as regras de negÛcio da aplicaÁ„o.
O mais comum em uma aplicaÁ„o web È manter as informaÁıes gravadas em um banco de dados relacional. O grande problema, È que as melhores linguagens de programaÁ„o para web s„o orientadas a objeto, o que torna complicado a integraÁ„o entre esses bancos e essas linguagens. AlÈm disso, mesmo em linguagens estruturadas como Pascal e C, trabalhar com banco de dados tornava-se uma tarefa ·rdua · medida que a aplicaÁ„o ia crescendo. Um modo de programaÁ„o muito usada, mesmo em linguagens tipicamente orientadas a objeto como PHP e JSP, È misturar lÛgica de negÛcio com cÛdigo SQL. Se o banco de dados da aplicaÁ„o mudasse, seria necess·rio reescrever praticamente toda a aplicaÁ„o, para dar suporte ao novo banco.
Uma tÈcnica bastante conhecida da orientaÁ„o a objetos È o encapsulamento, onde podemos esconder nossas regras dentro de objetos e definir alguns mÈtodos nesses objetos que o mundo externo poder· usar para ter acesso ao resultado de nossos cÛdigos. Essa idÈia foi adaptada ‡ programaÁ„o com banco de dados. Os mÈtodos necess·rios ao acesso e manipulaÁ„o do banco ficam escondidos dentro de classes b·sicas. As outras partes da aplicaÁ„o usam essas classes e seus objetos, ou seja, a aplicaÁ„o nunca ter· acesso diretamente ao nosso banco.
MAPEAMENTO OBJETO/RELACIONAL
As bibliotecas de Mapeamento Objeto/Relacional fazem o mapeamento de tabelas para classes. Se o banco de dados possui uma tabela chamada Pedidos , a aplicaÁ„o possuir· uma classe denominada Pedido. Essa classe definir· atributos, que ser„o usados para receber e alterar os dados dos campos das tabelas, alÈm de mÈtodos para calcular os juros, valor total do pedido e etc.
AlÈm disso, as classes Rails que fazem essa interface com as tabelas do banco de dados, provÍem um conjunto de mÈtodos de alto-nÌvel que servem para realizar operaÁıes b·sicas nas tabelas, como recuperar um registro atravÈs de um id , dentre outros.
O Active Record È a camada de Mapeamento Objeto Relacional fornecido pelo Rails, fazendo todo o mapeamento de Tabelas para classes, registros para objetos e colunas para atributos de objetos. O Active Record minimiza grau de configuraÁıes que devem ser realizadas pelo programador, atravÈs do uso de convenÁıes e de configuraÁıes default.
require 'active_record' class Order < ActiveRecord::Base end
order = Order.find(1) order.discount = 0. order.save
O cÛdigo acima mostra um programa que usa o Active Record para acessar uma tabela. O cÛdigo usa a classe Order para recuperar o pedido cujo Id È 1 e modificar o desconto. O Active Record torna muito simples o acesso a banco de dados, deixando o programador livre para trabalhar com a regra de negÛcio. AlÈm disso, o Active Record È capaz de realizar outras tarefas, como sofisticadas validaÁıes de dados do modelo.
VIS√O E CONTROLADOR
Basicamente, o Controlador fornece dados para a vis„o e recebe de volta eventos das p·ginas geradas pela vis„o. Por causa dessa grande integraÁ„o entre esses dois, vis„o e controlador est„o juntos no mesmo pacote, chamado de Action Pack. Apesar desses dois componentes estarem no mesmo pacote, suas tarefas s„o claramente divididas. Rails permite o desenvolver escrever aplicaÁıes web separando claramente os cÛdigo para controle e lÛgica de apresentaÁ„o.
VIS√O
No Rails, È responsabilidade da vis„o toda ou partes da p·gina que ser· visualizada no navegador, basicamente cÛdigo html que mostra algum texto fixo. Tipicamente, o desenvolvedor poder· acrescentar algum conte˙do din‚mico atravÈs do uso de alguma aÁ„o(action) no controlador. No Rails, conte˙dos din‚micos s„o gerados via templates, que pode ocorrer de duas formas.Uma forma consiste em intercalar pedaÁos de cÛdigo Ruby dentro dos htmlís da vis„o, atravÈs de uma ferramenta Ruby chamada de ERb (ou Embedded Ruby). Esta abordagem È muito flexÌvel, mas os puristas podem reclamar que viola todo o espÌrito do MVC. Intercalando cÛdigo na vis„o, podemos correr o risco de adicionar lÛgica que deveria estar no controlador ou modelo.
Rails tambÈm suporta visıes builder-style. Estas permitem a construÁ„o de documentos XML usando cÛdigo Ruby ñ a estrutura dos XML gerados automaticamente seguira a estrutura do cÛdigo.
O controlador Rails È o centro lÛgico da aplicaÁ„o. Ele coordena a interaÁ„o entre o usu·rio, a vis„o e o modelo. Contudo, Rails realiza quase toda essa operaÁ„o detr·s das cenas; o cÛdigo escrito pelo desenvolvedor ser· concentrado nas funcionalidades a nÌvel de aplicaÁ„o. Esta caracterÌstica torna o cÛdigo de controlador do Rails surpreendentemente f·cil de desenvolver e manter.
O controlador tambÈm È respons·vel por importantes serviÁos auxiliares, tais como:
… sua responsabilidade realizar o roteamento requisiÁıes externas para actions internas. Ele manuseia URL extremamente bem. (It handles people-friendly URLs extremely well.)
Antes de comeÁar uma aplicaÁ„o Rails, È necess·rio realizar o download do mesmo e instala-lo no computador. Para instalar o Rails, È preciso antes instalar a linguagem Ruby, que pode ter seu download feito em:
http://www. ruby-lang.org
L· encontramos os fontes da linguagem. Se vocÍ utiliza alguma distribuiÁ„o que utiliza pacotes, por favor verifique se o pacote do Ruby se encontra disponÌvel.
Depois precisamos do RubyGems, que È um gerenciador de pacotes para o Ruby. Pode ter seu download feito em:
http://docs.rubygems.org/
ApÛs instalados o Ruby e o RubyGems, podemos instalar o pacote do Rails facilmente com o comando:
gem install rails
Digite rails no seu console e verifique o que acontece. Se n„o acontecer nada, houve algum problema. Verifique a sua instalaÁ„o.
RAILS E BANCO DE DADOS
Se a aplicaÁ„o usa banco de dados, h· mais alguns passos necess·rios a serem realizados antes de comeÁar o desenvolvimento da aplicaÁ„o.
Rails trabalha com DB2, MySQL, Oracle, Postgres, SQL Server e SQLite. Para todos esses bancos, com exceÁ„o do Mysql, ser· necess·rio instalar um driver. O Rails vem com um driver ìbuilt-inî para MySql.
Caso seja necess·rio conectar sua aplicaÁ„o a um banco de dados diferente do MySql, ser· necess·rio o download do driver especifico para o banco. Geralmente esse driver est· na forma de cÛdigo-fonte, tornando necess·ria a compilaÁ„o do mesmo antes de us·-lo.
Vamos escrever uma aplicaÁ„o web trivial para termos o primeiro contato com o Rails e verificarmos o modo como uma aplicaÁ„o Rails funciona.
CRIANDO UMA NOVA APLICA«√O
Quando a framework rails È instalada, uma nova ferramenta de linha de comando, rails, È adicionada. Essa ferramenta È usada para construir uma nova aplicaÁ„o. Uma aplicaÁ„o Rails, consiste basicamente de cÛdigo Ruby, poder-se-ia construir uma aplicaÁ„o, sem a necessidade dessa nova ferramenta. No entanto, Rails, faz um pouco de m·gica por detr·s das cortinas, fazendo sua aplicaÁ„o funcionar com um mÌnimo de configuraÁ„o necess·ria.
Para criar sua primeira aplicaÁ„o, abra um shell (terminal) e navegue atÈ o diretÛrio onde deseja-se criar a estrutura de diretÛrios da nova aplicaÁ„o. Neste exemplo, o projeto ser· criado dentro de um diretÛrio chamada curso. Dentro deste diretÛrio, use o rails para criar uma aplicaÁ„o chamada demo. Muito cuidado, caso haja um sub-diretÛrio chamado demo, ser· perguntado se vocÍ deseja sobrescrever qualquer arquivo existente.
marvin> cd teste curso> rails demo create create app/controllers create app/helpers create app/models create app/views/layouts
... ... ... create log/server.log create log/production.log create log/development.log create log/test.log teste>
O comando criou um diretÛrio chamado demo. Listando o conte˙do deste diretÛrio, ìls -pî no unix ou ìdirî no windows, poderemos ver a estrutura criada.
teste> cd demo demo> ls ñp app/ db/ log/ teste/ component/ doc/ public/ vendor/ config/ lib/ script/
Por enquanto, vamos dar uma olhada apenas do diretÛrio public. Dentre v·rios, h· trÍs arquivos que chamam a atenÁ„o. Os arquivos dispatch.cgi, dispatch.fcgi e o
Como foi visto anteriormente, a arquitetura do Rails È baseado no modelo MVC. Rails aceita pedidos de entrada de algum navegador, decodifica esse pedido para encontrar um controlador e chamar um mÈtodo daquele controlador. O controlador invoca uma vis„o particular para mostrar o resultado para o usu·rio. A boa notÌcia È que o rails resolve tudo isso para vocÍ. Para escrever nossa aplicaÁ„o ìOl· Mundoî, precisamos de um cÛdigo para um controlador e uma vis„o. Por enquanto, n„o precisamos de um cÛdigo para o modelo, uma vez que n„o estamos manipulando dados. Vamos iniciar o controlador.
Para criar um novo controlador, vamos usar um utilit·rio chamado generate que est· dentro do diretÛrio script.
demo> ruby script/generate controller Mundo exists app/controllers/ exists app/helpers/ create app/views/mundo exists test/functional/ create app/controllers/mundo_controller.rb create test/functional/mundo_controller_test.rb create app/helpers/mundo_helper.rb
Acabamos de criar um controlador chamado de ìMundoî. Foram criados trÍs arquivos:
create app/controllers/ mundo_controller.rb create test/functional/ mundo_controller_test.rb create app/helpers/ mundo_helper.rb
Vamos olhar o cÛdigo do nosso controlador mundo_controller.rb :
class MundoController < ApplicationController end
MundoController È uma classe vazia que herda de ApplicationController, por isso possui o comportamento default de um controlador. Precisamos adicionar algum cÛdigo de modo que nosso controlador possa tratar requisiÁıes de entrada. Antes, vamos olhar o modo que o Rails trata as requisiÁıes.
Como qualquer outra aplicaÁ„o, uma aplicaÁ„o Rails È acessada pelo usu·rio atravÈs de sua URL.
Vamos analisar o formato de uma URL de uma aplicaÁ„o Rails:
http://www.marvinlemos.net/sistema/demo/mundo/ola
1 ñ www.marvinlemos.net/sistema/demo : identifica a aplicaÁ„o 2 ñ mundo : identifica um controlador 3 ñ ola : identifica a aÁ„o a ser invocada
PRIMEIRA A«√O
Vamos adicionar uma aÁ„o chamada de ola, que consiste basicamente de um mÈtodo da classe MundoController. Por enquanto, o mÈtodo n„o vai realizar nada.
class MundoController < ApplicationController def ola end end
Vamos tentar chamar nossa aÁ„o a partir do navegador: http://localhost:3000/mundo/ola
O erro acima era esperado. Criamos uma classe Controlador e uma aÁ„o, mas n„o informamos ao Rails o que ele deve exibir para o usu·rio. … aÌ aonde a vis„o entra. Quando usamos o script para criar nosso controlador, foram criados trÍs arquivos e um diretÛrio chamado app/view. Esse diretÛrio contÈm os arquivos de templates para as visıes do controlador. No nosso caso um controlador chamado mundo, por isso, as visıes para esse controlador ser„o armazenados dentro de um diretÛrio chamando app/views/mundo.
Para completar nossa aplicaÁ„o ìOl·, mundo!î, vamos criar um template. Por default, Rails procurar por templeates em um arquivo com o mesmo nome da aÁ„o. Neste caso, precisamos criar um arquivo chamado app/views/mundo/ola.rhtml, com o seguinte conte˙do:
Tempo em uma hora: <%= 1.hour.from_now %>
Ao atualizar o navegador, o template ir· gerar o seguinte resultado:
AlÈm disso, cÛdigo compreendido entre <% e %> (sem o sÌmbolo ì=î) È interpretado como cÛdigo Ruby que È executado sem substituiÁ„o na saÌda. O interessante nessa caracterÌstica È a possibilidade de misturar com cÛdigo n„o-Ruby. Repare uma vers„o modificado do ola.rhtml :
Soma: <%= 1+2 %> ConcatenaÁ„o: <%= "Ruby "+ "on "+"Rails" %> Tempo em uma hora: <%= 1.hour.from_now %>
<% 3.times do %> Ho! <% end %> Feliz Natal!
O resultado no navegador ser·:
Perceba como o texto dentro do laÁo Ruby È enviado para a saÌda uma vez a cada interaÁ„o do loop. Podemos misturar as duas formas:
<% 3.downto(1) do |count| %> <%= count %>... <% end %> Bum!
O resultado no navegador ser·:
Para adicionar a hora podemos chamar um mÈtodo do Ruby chamado ìTime.nowî a partir do nosso template:
Minha primeira aplicaÁ„o Rails
Ol·, Mundo!
Por que tivemos esse trabalho extra de adicionar o c·lculo da hora no controlador? Porque os benefÌcios que esse serviÁo traz, vale a pena. Vamos supor que vocÍ queira estender sua aplicaÁ„o no futuro para suportar usu·rios de v·rios paÌses. Neste caso, È interessante que a data seja formatada de acordo com o fuso hor·rio do paÌs do usu·rio. TerÌamos apenas que alterar nosso controlador, com isso, nossa aplicaÁ„o tornar-se-· bem mais flexÌvel.
Normalmente, cada p·gina da aplicaÁ„o corresponder· a uma vis„o separada. No nosso caso, usaremos uma nova aÁ„o para manusear a p·gina (Embora nem sempre seja assim). Usaremos o mesmo controlador para ambas as aÁıes. Vamos adicionar a aÁ„o tchau:
class MundoController < ApplicationController def ola @hora = Time.now end
def tchau end end
E o nosso arquivo app/views/mundo/tchau.rhtml:
O resultado dever· sem parecido com a figura abaixo:
Vamos agora adicionar um link na p·gina ola.rhtml apontando para tchau.rhtml e um link em tchau.rhtml apontando para ola.rhtml. No arquivo ola.rhml poderÌamos fazer assim:
Minha primeira aplicaÁ„o Rails
...
Diga Tchau!
E no arquivo tchau.rhtml:
V· em paz :P
Tchau
Espero que tenha gostado do Rails
Diga Ola!
Essa forma com certeza funcionaria, mas È um pouco fr·gil. Se movÍssemos a aplicaÁ„o para um lugar diferente no servidor web, as URLís n„o seriam mais v·lidas. O rails vem com um conjunto de mÈtodos conhecido como helpers que pode ser usado nos templates da vis„o. Aqui, usaremos um mÈtodo chamado de link_to(), o qual cria um hiperlink (dentre outra coisas). Assim, nosso arquivo ola.rhtml ficaria:
Minha primeira aplicaÁ„o Rails
Ol·, Mundo!
Hora.....: <%= Time.now %>
### CONSTRUINDO NOSSA APLICA«√O
O objetivo desta apostila È demonstrar a construÁ„o de uma aplicaÁ„o web usando a framework Rails. Vamos tomar como base, uma aplicaÁ„o muito comum hoje na internet: uma loja on-line, mais precisamente uma livraria. Vamos chamar nossa aplicaÁ„o de livrovirtual.
No console do sistema operacional, digite rails seguido do nome do projeto, no nosso caso: livrovirtual.
curso> rails livrovirtual
Dever· aparecer na tela algo mais ou menos perecido com isso:
create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create components ... create log/production.log create log/development.log create log/test.log
Nossa aplicaÁ„o foi criada com sucesso.
CRIAR O BANCO DE DADOS
Para essa aplicaÁ„o, usaremos o banco de dados open-source MySQL Sever. N„o cobriremos nessa apostila como instalar o Banco de Dados. H· v·rias fontes disponÌveis na internet mostrando como realizar essa tarefa.
Usaremos o cliente chamado mysql para trabalhar com nosso banco de dados. … uma ferramenta usada em linha de comando, entretanto sinta-se livre para usar qualquer cliente GUI de sua preferÍncia.
No console do sistema, digite o seguinte comando:
curso > mysql -u root ñp
Ser· solicitado, em seguida, a senha do usu·rio root do MySql:
Enter password: *******
ApÛs o login, ser· mostrado o seguinte resultado na tela:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 5.0.21-community
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
No prompt do mysql, digite os seguintes comandos:
mysql> create database livrovirtual_development; mysql> create database livrovirtual_test; mysql> create database livrovirtual_production;
mysql> grant all on livrovirtual_development.* to curso@localhost; mysql> grant all on livrovirtual_test.* to curso@localhost; mysql> grant all on livrovirtual_production.* to curso@localhost identified by 'livr0pr0d'; mysql> flush privileges;
CRIAR AS TABELAS DO BANCO
Vamos criar primeiro a tabela de Produtos. Segue abaixo a DDL (Data Definition Language) para a criaÁ„o da mesma no MySql:
drop table if exists produtos; create table products ( id int not null auto_increment, nome varchar(100) not null, descricao text not null, image_url varchar(100) not null, preco decimal(10,2) not null, primary key(id) );
No prompt do mysql, execute o comando abaixo, e, logo em seguida, digite a DDL:
mysql> use livrovirtual_development
O comando acima foi necess·rio para especificar que queremos trabalhar com o banco livrovirtual_development
Uma observaÁ„o muito importante: o Rails assume que toda tabela possui um campo chave-prim·ria chamado de ì id î do tipo int. AlÈm disso, ele È faz distinÁ„o entre mai˙sculo e min˙sculo. Lembre-se sempre de criar as chaves prim·rias de suas tabelas com o nome id.