Professional Documents
Culture Documents
Desenvolvimento ágil
com Ruby on Rails
São Paulo, SP
2010
FATEC – SP
Faculdade de Tecnologia de São Paulo
Desenvolvimento ágil
com Ruby on Rails
São Paulo, SP
2010
Agradecimentos:
INTRODUÇÃO..............................................................................................................01
1 CONCEITOS BÁSICOS........................................................................................... 03
1.1 O que é Ruby ?.......................................................................................... 03
1.2 Características da linguagem Ruby........................................................... 04
1.3 O que são Ruby Gems ?............................................................................ 05
1.4 O que é MVC ?.......................................................................................... 06
1.5 O que é Rails?............................................................................................ 08
2 A LINGUAGEM RUBY........................................................................................... 09
2.1 Instalando o ruby....................................................................................... 09
2.2 Programando em ruby............................................................................... 10
2.2.1 As convenções do Ruby................................................................. 11
2.2.2 Os Arrays....................................................................................... 12
2.2.3 Retorno de métodos....................................................................... 13
2.2.4 Criando classes no ruby................................................................. 13
2.2.5 Herança em Ruby...........................................................................15
2.2.6 Polimorfismo e interfaces.............................................................. 16
2.2.7 Os Hashes...................................................................................... 17
2.2.8 Como funciona o CompareTo........................................................18
2.2.9 Metaprogramação.......................................................................... 18
2.2.10 Closures......................................................................................... 20
3 RAILS........................................................................................................................ 22
3.1 Começando a usar o rails........................................................................... 23
3.2 A primeira aplicação no rails..................................................................... 27
3.2.1 O plugin ActiveScaffold.................................................................. 30
CONCLUSÃO.............................................................................................................. ..83
BIBLIOGRAFIA.......................................................................................................... ..84
Lista de Figuras
1. CRUD – Create Retrive Update Delete. Significa uma tela de cadastro com as
funções de Inserir, Consultar, Alterar e Excluir.
INTRODUÇÃO
ser centralizado, ser acessível de qualquer lugar que disponibilize de conexão com
etc), permitir uma infra-estrutura com um custo reduzido em relação à sistemas que
vantagens costumam atrair desenvolvedores para o ambiente web, mesmo em frente aos
problemas como: segurança (que são muito comuns na web e complexos de resolver),
principalmente no Brasil que ainda não tem uma conexão de boa qualidade), etc.
eficiente que as ferramentas atuais e tão eficaz quanto, obtendo a mesma produtividade
linguagem que não serão muito aprofundados, apenas mostrado o essencial para que se
ênfase.
3
1 CONCEITOS BÁSICOS
Tipagem Forte, orientada a objetos, com várias semelhanças com Perl, Python e
SmallTalk.
rápida, tem um suporte a orientação a objetos que tem o objetivo de ser simples e
prático. A linguagem, escrita em C, foi criada pelo japonês Yukihiro Matsumoto (Matz)
, que aproveitou o que considerou serem as melhores idéias das outras linguagens da
Matz decidiu desenvolver sua própria linguagem porque queria uma linguagem
de script que fosse mais poderosa que Perl e mais orientada a objetos que Phyton.
primeiro “hello world” programado em Ruby rodou no verão do mesmo ano. A primeira
suas linguagens preferidas e acabou por escrever um dos mais completos livros sobre a
4
O nome "Ruby", foi decidido durante uma sessão de bate-papo online entre
linha de código tivesse sido escrita para a linguagem.[11] Inicialmente foram propostos
dois nomes: "Coral" e "Ruby", sendo esse último nome proposto escolhido mais tarde
por Matz em um e-mail para Ishitsuka.[12] Mais tarde Matz descobriu que Pearl é a
pedra preciosa que simboliza o mês de Junho e Ruby é a pedra que simboliza Julho,
então ele concluiu que é um nome apropriado para uma linguagem que surge depois do
Perl
Todas as variáveis são objetos, onde até os "tipos primitivos" (tais como
accessors";
devem ter um tipo (fazer parte de uma classe), mas a classe pode ser
alterada dinamicamente;
o IronRuby.
Ruby gems são bibliotecas e frameworks tais como : hibernate , spring e struts o
são para Java. A diferença entre as Ruby Gems e os tradicionais frameworks Java é que
as ruby Gems podem ser instaladas por um comando simples, tal como o : "apt-get
Mais adiante será demonstrada a instalação do ruby gem, mas por hora vale
lembrar que em uma maquina com o Rubygem corretamente instalado , basta fazer o
Existem hoje nos repositórios do rails , mais de 12 mil gems disponíveis para as
mais diversas necessidades. Além das gems existem ainda as bibliotecas que não
chegam a ir para os repositórios por serem muito recentes ou por serem muito simples ,
essas bibliotecas podem ser baixadas e utilizadas gratuitamente de portais tais como :
Active Scaffold que será demonstrada mais adiante para desenvolver cadastros.
Essa é uma sigla comum para a programação web e entender sua definição é
insert ou update na própria página que o internauta vê , e ainda a própria página decide
qual será a próxima página a ser exibida (fluxo do sistema); os sistemas baseados no
MVC tentam organizar as coisas colocando cada coisa no seu devido lugar , visando
web:
7
manipular esses dados. No caso do Rails (o meta-framework que usaremos com o ruby),
o model é primeiramente usado pra gerenciar as regras de interação com uma base de
dados correspondente. Na maioria dos casos uma tabela do banco de dados terá um
concentradas no Model.
No rails, as views costumam ser arquivos HTML com código ruby embutido que
PUT , DELETE) trata a requisição (persiste os dados no banco , valida login) e por
último redireciona o usuário para a página adequada. Faz a ligação entre o model e o
view.
O controlador „listafilmes‟:
- recebe a requisição
Ao ver a página o usuário pode clicar em algum link e então mandar outra
Rails é uma gem desenvolvida utilizando a linguagem ruby que tem como
Tornou-se muito popular por ser extremamente produtiva ao utilizar conceitos como
Rails é produtivo por se basear em padrões e por isso dispensar os XMLs e/ou
annotations.
2 A LINGUAGEM RUBY
2.1 Instalando o ruby
Uma das grandes dificuldades do ruby on rails é possuir série vários elementos a
LTS (Lucid Lynx) , rails na versão 2.3.2 e banco de dados MySQL. E para
Firebird.
comando :
comando :
irb
irb(main):001:0>
10
if condição
comando
if condição
comando A
else
comando b
if condição
comandoA1
comandoA2
else
comandob1
comandob2
end
11
É possível ainda:
== igual
> maior
< menor
!= diferente
principais :
'alguma string'.empty?
cliente.is_restrito?
#todo método que modifica efetivamente uma classe deve terminar com !
cliente.restringe!
12
def ==(pessoa)
return @nome == pessoa.nome
end
p1 = pessoa.new
p2 = pessoa.new
2.2.2 Os Arrays
a = Array.new
#equivalente a
a = []
a << 2
a[1] = 3 #outro método de atribuição
a = [2,5,'a']
#para testar:
def MetodoDuploRet
return 2,7
end
puts MetodoDuploRet
a = MetodoDuploRet
puts a
b,c = MetodoDuploRet
puts b
puts c
ruby:
Pessoa = Class.new do
def say
puts 'hello'
end
end
p = Pessoa.new
p.say
14
Pessoa2 = Class.new
#Método fora de qualquer classe vai para Object
def say2
puts 'p2'
end
#Pessoa2.say2
self.say2
self.class
Object.say2
class Pessoa
#não precisa declarar o field
#setter
def nome=(valor)
@nome = valor
end
#getter
def nome
@nome
end
#construtor
def initialize (valor)
@nome = valor
end
class Animal
def come
puts 'comendo'
end
private
def metodo_privado
puts 'este é privado'
end
end
class Peixe < Animal
end
p = Peixe.new
p.come
#duck typing
class PatoEstranho
def faz_quack
puts 'queck'
end
end
class PatoNormal
def faz_quack
puts 'quack'
end
end
class CriadorDePato
def castiga(pato)
pato.faz_quack
end
end
pe = PatoEstranho.new
pn = PatoNormal.new
c = CriadorDePato.new
c.castiga pe
c.castiga pn
17
2.2.7 Os Hashes
class Carro
attr_accessor :dono
def initialize (nomedono)
@dono = nomedono
end
end
c1 = Carro.new "Ricardo"
c2 = Carro.new "mariana"
#criando um hash
detran = {:"ABC1122" => c1,
:"EBE5774" => c2}
puts detran[:"EBE5774"].dono
def transfere(args)
puts "transferindo #{args[:valor]} para a conta #{args[:n]}"
end
#mais simples
transfere :valor => 100, :n => 234
18
class Cachorro
attr_accessor :peso
end
2.2.9 Metaprogramação
todo código Ruby é executado – não há separação entre fases de compilação e runtime,
class Aluno
end
19
class Professor
def ensina aluno
def aluno.responde # aqui é possível adicionar um método à classe
aluno
puts 'agora eu sei tudo'
end
end
end
a = Aluno.new
#a.responde
p = Professor.new
p.ensina a
a.responde
class Carro
end
class Oficina
def turbina(carro)
def carro.turbo
puts 'turbo ligado'
end
end
end
c = Carro.new
#c.turbo
o = Oficina.new
o.turbina c
c.turbo
20
2.2.10 Closures
def metodo
puts "linha 1"
yield #aqui vai entrar o código do bloco que vier como parâmetro
end
#como parâmetro
def metodo2
puts "linha B1"
yield "ricardo" , "adv" # O código que vier aqui vai receber estes dois
parâmetros
yield("facilita" , "facilitador") # Também pode se usar parênteses
end
# como funciona:
met do
puts 'teste'
end
# o mesmo que o anterior mas utilizando uma variável para guardar o bloco
#aqui não é preciso do & pois passa uma variável com o bloco
bloco = lambda {
puts 'teste2'
}
3 RAILS
Conforme já foi mostrado antes, o Rails, é um framework desenvolvido em
Ruby e de código aberto assim como Ruby. Leva em sua arquitetura o design pattern
visualização.
de vários componentes:
Active Record
Action Pack
Action Mailer
correspondência.
Active Support
Action WebServices
e SOAP.
O Action Web Service não estará mais presente na versão 2.0 no Rails, visto que
o mesmo está voltando-se para a utilização do modelo REST. Mesmo assim, aos ainda
No Console digitando:
ruby. Este não vale a pena instalar via apt-get install porque a versão nos repositórios
No Console digitando:
cd /usr/local
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
cd rubygems-1.3.5/
Gem:
ricardo@programacao1:/usr/local$ gem1.8
Examples:
gem install rake
gem list --local
gem build package.gemspec
gem help install
Further help:
gem help commands list all 'gem' commands
gem help examples show some examples of usage
gem help platforms show information about platforms
gem help <COMMAND> show help on COMMAND
(e.g. 'gem help install')
Further information:
http://rubygems.rubyforge.org
Embora pareça, o rubygems não está instalado ainda, faltam bibliotecas que ele
utiliza em C++ .
Para todos os exemplos a seguir, será utilizado o mysql , então é preciso instalar
actionmailer (2.3.2)
actionpack (2.3.2)
activerecord (2.3.2)
activeresource (2.3.2)
activesupport (2.3.2)
cgi_multipart_eof_fix (2.5.0)
daemons (1.1.0)
27
fastthread (1.0.7)
gem_plugin (0.2.3)
mongrel (1.1.5)
mysql (2.8.1)
rails (2.3.2)
rake (0.8.7)
ambiente em http://www.aptana.com/radrails/download/
comando :
projeto pelo console Shell, são executados (para criar as pastas do projeto):
cd /home
mkdir fontes
mkdir rails
cd /home/fontes/rails
28
Agora para criar um projeto cujo banco de dados é mysql (via Shell):
Feito isso o rails vai criar uma pasta „agenda‟ com uma determinada estrutura de
app/ – Dentro dessa pasta estão os arquivos da estrutura MVC – (Model, View e
Controller);
dados;
banco de dados;
public/ – Diretório acessível pela Web. É a pasta onde o HTTP server utiliza pra
rodar o aplicativo;
29
desenvolvedores Rails;
aplicativo;
As pastas app/ e db/ é onde fica quase toda a aplicação, são as pastas mais
alteradas em um projeto.
Todo projeto rails tem alguns scripts padrões na sua pasta raiz , então ao digitar
cd agenda
script/server start - Inicia a aplicação no browser (põe no ar), para parar basta
arquivo config/database.yml
rake db:migrate:down -Version xxxx - Volta o banco de dados para uma versão
específica.
alguns deles :
etc...)
desenvolvimento web.
O active scaffold pode ser instalado com um comando na pasta do projeto rails,
mas antes (apenas na primeira vez) é necessário instalar uma dependência, o git-core :
Scaffold no projeto:
Abrir o Aptana (via shell script, para abrir como root) e adicionar o projeto
nele:
comando
sudo ./AptanaRadRails
File -> New -> Rails Project , selecione a opção „Create project from existing
source‟ e busque a pasta onde o projeto foi criado anteriormente via shell (pelo
public/stylesheets:
conteúdo:
<html>
<head>
<title>Contatos</title>
32
</head>
<body>
</body>
</html>
conteúdo (esse conteúdo é apenas sugestivo, é o layout padrão da aplicação e pode ser
a{
text-decoration: none;
color:#AAAAAA;
font-weight:bold;
a:hover {
color: #AFD0F5;
}
33
criado o cadastro:
- como será o primeiro cadastro, é necessário criar o banco de dados, mas antes é
development:
adapter: mysql
encoding: utf8
reconnect: false
database: agenda_development
pool: 5
username: root
password: 123456
socket: /var/run/mysqld/mysqld.sock
production:
adapter: mysql
34
encoding: utf8
reconnect: false
database: agenda_production
pool: 5
username: root
password: 123456
socket: /var/run/mysqld/mysqld.sock
rake db:create:all
Cria-se a migration, que criará a tabela no banco de dados (via shell script):
rake db:migrate
contatos_controller.rb
end
http://localhost:3000/contatos/
o erro na ordenação.
adicionar a linha :
config.i18n.default_locale = :pt
pt:
# formatos de data e hora
active_scaffold:
add: "Add"
add_existing: "Associar existente"
are_you_sure: "Você tem certeza?"
cancel: "Cancelar"
click_to_edit: "Click para editar"
close: "Fechar"
create: "Inserir"
create_model: "Inserir {{model}}"
36
# error_messages
internal_error: "Request Failed (code 500, Internal Error)"
version_inconsistency: "Version inconsistency - this record has been modified since you
started editing it."
date:
formats:
default: "%d/%m/%Y"
short: "%d de %B"
long: "%d de %B de %Y"
time:
formats:
default: "%A, %d de %B de %Y, %H:%M hs"
short: "%d/%m, %H:%M hs"
long: "%A, %d de %B de %Y, %H:%M hs"
am: ''
pm: ''
x_seconds:
one: '1 segundo'
other: '{{count}} segundos'
less_than_x_minutes:
one: 'menos de um minuto'
other: 'menos de {{count}} minutos'
x_minutes:
one: '1 minuto'
other: '{{count}} minutos'
about_x_hours:
one: 'aproximadamente 1 hora'
other: 'aproximadamente {{count}} horas'
x_days:
one: '1 dia'
other: '{{count}} dias'
about_x_months:
one: 'aproximadamente 1 mês'
other: 'aproximadamente {{count}} meses'
x_months:
one: '1 mês'
other: '{{count}} meses'
about_x_years:
one: 'aproximadamente 1 ano'
other: 'aproximadamente {{count}} anos'
over_x_years:
one: 'mais de 1 ano'
other: 'mais de {{count}} anos'
prompts:
39
year: "Ano"
month: "Mês"
day: "Dia"
hour: "Hora"
minute: "Minuto"
second: "Segundos"
# numeros
number:
format:
precision: 3
separator: ','
delimiter: '.'
currency:
format:
unit: 'R$'
precision: 2
format: '%u %n'
separator: ','
delimiter: '.'
percentage:
format:
delimiter: '.'
precision:
format:
delimiter: '.'
human:
format:
precision: 1
delimiter: '.'
storage_units:
format: "%n %u"
units:
byte:
one: "Byte"
other: "Bytes"
kb: "KB"
mb: "MB"
gb: "GB"
40
tb: "TB"
# Used in array.to_sentence.
support:
array:
words_connector: ", "
two_words_connector: " e "
last_word_connector: " e "
# Active Record
activerecord:
errors:
template:
header:
one: "Não foi possível gravar {{model}}: 1 erro"
other: "Não foi possível gravar {{model}}: {{count}} erros."
body: "Por favor, verifique o(s) seguinte(s) campo(s):"
messages:
inclusion: "não está incluído na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não está de acordo com a confirmação"
accepted: "deve ser aceito"
empty: "não pode ficar vazio"
blank: "não pode ficar em branco"
too_long: "é muito longo (máximo: {{count}} caracteres)"
too_short: "é muito curto (mínimo: {{count}} caracteres)"
wrong_length: "não possui o tamanho esperado ({{count}} caracteres)"
taken: "já está em uso"
not_a_number: "não é um número"
greater_than: "deve ser maior do que {{count}}"
greater_than_or_equal_to: "deve ser maior ou igual a {{count}}"
equal_to: "deve ser igual a {{count}}"
less_than: "deve ser menor do que {{count}}"
less_than_or_equal_to: "deve ser menor ou igual a {{count}}"
odd: "deve ser ímpar"
even: "deve ser par"
41
seguinte:
http://localhost:3000/contatos/
Para definir a ordem das colunas do grid e quais colunas aparecerão é necessário
definir no controlador uma matriz com as colunas e a ordem que serão exibidas.
Para alterar o label dos campos que são exibidos ao usuário e colocar uma
Na edição do cadastro, para não aparecer uma descrição estranha como por
código no model (colocar o código via aptana dentro da classe „Contato‟, no model
def to_s
nome
end
SCAFFOLD (CRUD)
Antes de definir os passos para criar os cadastros vale lembrar que a qualquer
script/server start
http://localhost:3000/clientes
Criar o projeto
46
No shell:
cd /home/fontes/rails
./AptanaRadRails
No shell ():
rails-2.3
47
conteúdo:
a{
text-decoration: none;
color:#AAAAAA;
font-weight:bold;
a:hover {
color: #AFD0F5;
}
production:
adapter: mysql
encoding: utf8
reconnect: false
database: vendas_production
pool: 5
username: root
password: 123456
socket: /var/run/mysqld/mysqld.sock
No shell:
rake db:create:all
config.i18n.default_locale = :pt
conteúdo:
pt:
# formatos de data e hora
active_scaffold:
add: "Add"
add_existing: "Associar existente"
are_you_sure: "Você tem certeza?"
cancel: "Cancelar"
click_to_edit: "Click para editar"
close: "Fechar"
create: "Inserir"
create_model: "Inserir {{model}}"
50
# error_messages
internal_error: "Request Failed (code 500, Internal Error)"
version_inconsistency: "Version inconsistency - this record has been modified
since you started editing it."
date:
formats:
default: "%d/%m/%Y"
short: "%d de %B"
long: "%d de %B de %Y"
time:
formats:
default: "%A, %d de %B de %Y, %H:%M hs"
short: "%d/%m, %H:%M hs"
long: "%A, %d de %B de %Y, %H:%M hs"
am: ''
pm: ''
less_than_x_seconds:
one: 'menos de 1 segundo'
other: 'menos de {{count}} segundos'
x_seconds:
one: '1 segundo'
other: '{{count}} segundos'
less_than_x_minutes:
one: 'menos de um minuto'
other: 'menos de {{count}} minutos'
x_minutes:
one: '1 minuto'
other: '{{count}} minutos'
about_x_hours:
one: 'aproximadamente 1 hora'
other: 'aproximadamente {{count}} horas'
x_days:
one: '1 dia'
other: '{{count}} dias'
about_x_months:
one: 'aproximadamente 1 mês'
other: 'aproximadamente {{count}} meses'
x_months:
one: '1 mês'
other: '{{count}} meses'
about_x_years:
one: 'aproximadamente 1 ano'
other: 'aproximadamente {{count}} anos'
over_x_years:
one: 'mais de 1 ano'
other: 'mais de {{count}} anos'
53
prompts:
year: "Ano"
month: "Mês"
day: "Dia"
hour: "Hora"
minute: "Minuto"
second: "Segundos"
# numeros
number:
format:
precision: 3
separator: ','
delimiter: '.'
currency:
format:
unit: 'R$'
precision: 2
format: '%u %n'
separator: ','
delimiter: '.'
percentage:
format:
delimiter: '.'
precision:
format:
delimiter: '.'
human:
format:
precision: 1
delimiter: '.'
storage_units:
format: "%n %u"
units:
byte:
one: "Byte"
other: "Bytes"
kb: "KB"
mb: "MB"
54
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
array:
words_connector: ", "
two_words_connector: " e "
last_word_connector: " e "
# Active Record
activerecord:
errors:
template:
header:
one: "Não foi possível gravar {{model}}: 1 erro"
other: "Não foi possível gravar {{model}}: {{count}} erros."
body: "Por favor, verifique o(s) seguinte(s) campo(s):"
messages:
inclusion: "não está incluído na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não está de acordo com a confirmação"
accepted: "deve ser aceito"
empty: "não pode ficar vazio"
blank: "não pode ficar em branco"
too_long: "é muito longo (máximo: {{count}} caracteres)"
too_short: "é muito curto (mínimo: {{count}} caracteres)"
wrong_length: "não possui o tamanho esperado ({{count}} caracteres)"
taken: "já está em uso"
not_a_number: "não é um número"
greater_than: "deve ser maior do que {{count}}"
greater_than_or_equal_to: "deve ser maior ou igual a {{count}}"
equal_to: "deve ser igual a {{count}}"
less_than: "deve ser menor do que {{count}}"
less_than_or_equal_to: "deve ser menor ou igual a {{count}}"
odd: "deve ser ímpar"
even: "deve ser par"
55
Cadastro de clientes
No shell:
script/generate model cliente nome:string datanasc:date
numcli:integer rg:string
No shell:
rake db:migrate
Criar o controller
No shell:
def to_s
nome
end
Aqui o Cadastro está criado com as funções de inclusão, consulta (por qualquer
Cadastro de vendedores
No shell:
numvnd:integer comissao:float
No shell:
rake db:migrate
Criar o controller
No shell:
aptana) :
end
def to_s
nome
end
Cadastro de produtos
No shell:
No shell:
rake db:migrate
Criar o controller
No shell:
aptana) :
end
def to_s
descricao
end
61
</body>
</html>
Preparar a Index
No arquivo /config/routes.rb:
Procure por:
No Shell:
script/server start
No Browser:
Em Delphi:
/* tabela de cliente */
create table clientes(
id integer primary key,
nome varchar(255),
datanasc date,
fone varchar(255),
endereco varchar(255),
cep varchar(25),
bairro varchar(30),
63
cidade varchar(30),
estado varchar(2),
numcli integer,
rg varchar(25)
);
SET TERM ^;
CREATE TRIGGER INSCLI FOR CLIENTES
ACTIVE BEFORE INSERT
AS
BEGIN
IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN
NEW.ID = GEN_ID(GN_CLIENTES,1);
END
^
SET TERM ; ^
/* TABELA DE VENDEDORES */
SET TERM ^;
CREATE TRIGGER INSVND FOR VENDEDORES
ACTIVE BEFORE INSERT
AS
BEGIN
IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN
NEW.ID = GEN_ID(GN_VENDEDORES,1);
END
^
SET TERM ; ^
/* TABELA DE PRODUTOS */
SET TERM ^;
CREATE TRIGGER INSPROD FOR PRODUTOS
ACTIVE BEFORE INSERT
AS
BEGIN
IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN
NEW.ID = GEN_ID(GN_PRODUTOS,1);
END
^
SET TERM ; ^
para acessar o banco com dados como o caminho do banco, usuário, senha e o driver de
conexão ao banco.
dbxDB.Open;
Cadastro de Clientes
programa):
Application.CreateForm(TfrmClientes, frmClientes);
Action := caFree;
66
uses
Dialogs, dm;
fazer as ligações
Códigos utilizados:
No FormCreate:
banco)
A consulta é feita (apenas pelo campo „Nome‟) digitando no Edit acima do Grid.
Cadastro de Vendedores
programa):
Application.CreateForm(TfrmVendedores, frmVendedores);
Action := caFree;
uses
Dialogs, dm;
fazer as ligações
Códigos utilizados:
No FormCreate:
banco)
Cadastro de Produtos
programa):
Application.CreateForm(TfrmProdutos, frmProdutos);
Action := caFree;
uses
Dialogs, dm;
fazer as ligações
Códigos utilizados:
No FormCreate:
trigger no banco)
uses
Incluir no click de cada botão do menu criado o código para criar e abrir
vendedores
RubyOnRails
necessários. Alguns
A instalação de alguns componentes
problemas de
costuma ser simples (quando
incompatibilidade de
necessário).
versões podem ocorrer e
desenvolvimento de telas
é feita automaticamente,
possível se construir um
cadastro em cerca de 3
de um CRUD sem a
necessidade de codificar
essas ações.
75
5 IMPLEMENTAÇÃO DE VALIDAÇÕES
possui alguns métodos de validações já implementadas (para as mais usadas), entre elas:
preenchimento do campo
duplicação de registros
Validações:
if cdsClientesNome.isNull then
begin
ShowMessage(„O campo Nome é obrigatório‟);
exit;
end;
Nesse caso é tão simples quanto no rails. Porém para verificar se o registro é
sistema:
cadastrado") dentro do model Cliente.rb resolveria. Mas no Delphi, por exemplo, como
tem um cadastro com muitos registros), seria necessário criar uma função que
verificasse com um select no banco de dados se existe um registro que já possui aquele
RG.
validate :primeira_letra_maiuscula
private
def primeira_letra_maiuscula
errors.add("nome","primeira letra deve ser maiúscula") unless nome =~ /[A-Z].*/
end
}
mecanismos que cuidem para não perder os dados durante a validação do formulário
rails isso é feito sem a intervenção do programador. Tanto usando validações nativas,
JavaScript.
79
6 SEGURANÇA EM RAILS
HTML Injection
SQL Injection
Injection, ao visualizar uma página que imprimiria o nome do usuário, seria executado o
de uma determinada view do sistema , por exemplo , em uma tela que executa a
seguinte query:
'select senha , nome from usuarios where usuario = ' + edit1.value + ' '
80
Com isso ele consegue concatenar uma expressão no where da query (no caso a
expressão „ or 1=1‟ ) e ele pode conseguir ver todos os usuários cadastrados no banco
de dados.
Cross site scripting é uma formas de invasão muito poderosa, que consiste em
criar uma página pirata que consegue utilizar das sessões abertas para realizar uma
email do usuário.
situação. Talvez por costume, por não ser um padrão entre os desenvolvedores esse tipo
Para proteger contra SQL injection, o rails tem o método find() com conditions
que previne automaticamente grande parte dos métodos de SQL Injection. não utilizar o
findbysql.
O Ruby on Rails tem um filtro nativo de proteção contra SQL injection, o qual
irá escapar ‟ , " , o caractere NULL e quebras de linhas. Utilizando o método find(id) ou
Assim, evita-se usar o método findby_sql() que não possui essa proteção nativa.
Em comparação com outras linguagens web, por exemplo o php, para evitar a
SQL Injection seria necessário criar uma função para o tratamento das querys. O php
aspas simples e duplas antes de enviar para o banco de dados. Porém esta função não
funciona em todas as versões do PHP, então é necessário verificar se ela existe, e caso
estiver ON ele irá acrescentar barras invertidas automaticamente antes de aspas simples
e duplas, o problema é que ele irá enviar para o banco de dados com as barras
<?php
function anti_sql_injection($string)
{
$string = get_magic_quotes_gpc() ? stripslashes($string) : $string;
$string = function_exists("mysql_real_escape_string") ?
mysql_real_escape_string($string) : mysql_escape_string($string);
return $string;
}
?>
problemas no sistema. Enquanto que em rails é necessário colocar o caractere „h‟ antes
do campo. Por exemplo, <%=h c.nome %> . E utilizando alguns frameworks como o
programador.
83
CONCLUSÃO
Assim como a maioria das ferramentas para desenvolvimento web, o rails tem
comandos shell, etc) e como a instalação é feita por partes (não existe um instalador
único, são necessários comandos para o ruby, o rails, as gems, os plugins, etc) podem
e css, mas que pode ser contornado com a criação de um template padrão de projeto que
seria herdado para a criação das aplicações, ou apenas com procedimentos bem
definidos para evitar que alguma etapa seja esquecida e gere problemas futuros.
codificar o cadastro, desenhar as telas ou até mesmo criar o banco de dados (apenas
métodos.
(que costuma ser ignorada por uma parte dos programadores web e trabalhosa para a
outra parte que se preocupa com isso). Ele já possui alguns mecanismos de segurança
BIBLIOGRAFIA
Desenvolvimento ágil
com Ruby on Rails
São Paulo, SP
2010