Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Apostila Ruby, Notas de estudo de Informática

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

2013

Compartilhado em 30/03/2013

lyncon-lima-1
lyncon-lima-1 🇧🇷

4.8

(12)

10 documentos

1 / 81

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
APOSTILA RUBY ON RAILS
Marcus Vinícius de S. Lemos
www.marvinlemos.net
Teresina/PI
id197535501 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51

Pré-visualização parcial do texto

Baixe Apostila Ruby e outras Notas de estudo em PDF para Informática, somente na Docsity!

APOSTILA RUBY ON RAILS

Marcus VinÌcius de S. Lemos

www.marvinlemos.net

Teresina/PI

MODELOS, VIS’ES E CONTROLADORES

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.

ACTIVE RECORD: A CAMADA MODELO DO RAILS

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.

ACTIVE RECORD

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.

CONTROLADOR

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.)

3. INSTALANDO O RAILS

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.

4. ESCREVENDO A PRIMEIRA APLICA«√O

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

OL¡ MUNDO

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.

RAILS E AS URLS

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·:

ADICIONANDO HORA

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.

LINKANDO P¡GINAS

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.

CRIAR A APLICA«√O RAILS

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.