SlideShare uma empresa Scribd logo
Ruby On Rails
9 de Julho de 2008
Conteúdo
I Sobre essa apostila 3
II Informações Básicas 5
III GNU Free Documentation License 10
IV Ruby on Rails 19
1 O que é o curso Ruby on Rails 20
2 Plano de ensino 21
2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Iniciando o Ruby on Rails 24
3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 Configurando Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4 Gerando Migrações e Modelos de Dados 30
4.1 Gerando Migrações e Modelos de dados I . . . . . . . . . . . . . . . . . . . . . . . . 30
5 MVC e CONTROLLER 39
5.1 MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2 O primeiro controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 Layouts e Roteamento 43
6.1 Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2 Roteamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
1
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
7 Scaffolding e Validações 48
7.1 Scaffolding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7.2 Validações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8 Segundo Controller 56
8.1 Início . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9 Extendendo um modelo de dados e Helpers 69
9.1 Extendendo um modelo de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
9.2 Usando Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
10 Relacionamentos 75
10.1 Início . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
11 Belongs to 81
11.1 Belongs to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
12 Has many, has one, has many through 91
12.1 Has many . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
12.2 Has one . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
12.3 Has many, trough . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
2
Parte I
Sobre essa apostila
3
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Conteúdo
O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in-
ternet, disponíveis em diversos sites ou originalmente produzido no CDTC em http://www.cdtc.org.br.
O formato original deste material bem como sua atualização está disponível dentro da licença
GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de
mesmo nome, tendo inclusive uma versão traduzida (não oficial).
A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br), desde outubro
de 2006. Criticas e sugestões construtivas são bem-vindas a qualquer tempo.
Autores
A autoria deste conteúdo, atividades e avaliações é de responsabilidade de Diego de Aquino
Soares (diego@cdtc.org.br).
O texto original faz parte do projeto Centro de Difusão de Tecnolgia e Conhecimento, que vem
sendo realizado pelo ITI em conjunto com outros parceiros institucionais, atuando em conjunto
com as universidades federais brasileiras que tem produzido e utilizado Software Livre, apoiando
inclusive a comunidade Free Software junto a outras entidades no país.
Informações adicionais podem ser obtidas atréves do email ouvidoria@cdtc.org.br, ou da
home page da entidade, através da URL http://www.cdtc.org.br.
Garantias
O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi-
lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam
direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido.
Licença
Copyright ©2006,Diego de Aquino Soares (diego@cdtc.org.br).
Permission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.1 or any later version published by
the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS-
TILA. A copy of the license is included in the section entitled GNU Free Documentation
License.
4
Parte II
Informações Básicas
5
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Sobre o CDTC
Objetivo Geral
O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina-
ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do
desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira.
Objetivo Específico
Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e
de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os
servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado
nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios
de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo
treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários,
criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como
incentivadores e defensores de produtos de software não proprietários e código fonte aberto, ofe-
recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de
produtos de software não proprietários e de seu código fonte livre, articulando redes de terceiros
(dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro-
dutos de software livre.
Guia do aluno
Neste guia, você terá reunidas uma série de informações importantes para que você comece
seu curso. São elas:
• Licenças para cópia de material disponível
• Os 10 mandamentos do aluno de Educação a Distância
• Como participar dos fóruns e da wikipédia
• Primeiros passos
É muito importante que você entre em contato com TODAS estas informações, seguindo o
roteiro acima.
Licença
Copyright ©2006, Diego de Aquino Soares (diego@cdtc.org.br).
6
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos
da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior
publicada pela Free Software Foundation; com o Capítulo Invariante SOBRE ESSA
APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu-
mentação Livre GNU".
Os 10 mandamentos do aluno de educação online
• 1. Acesso a Internet: ter endereço eletrônico, um provedor e um equipamento adequado é
pré-requisito para a participação nos cursos a distância.
• 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá-
tica é necessário para poder executar as tarefas.
• 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân-
cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal,
dos colegas e dos professores.
• 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus
colegas de turma respeitando-os e fazendo ser respeitado pelo mesmo.
• 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão
e a sua recuperação de materiais.
• 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e
realizá-las em tempo real.
• 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre.
• 8. Flexibilidade e adaptação: requisitos necessário a mudança tecnológica, aprendizagens
e descobertas.
• 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é
ponto-chave na comunicação pela Internet.
• 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não
controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração.
Como participar dos fóruns e Wikipédia
Você tem um problema e precisa de ajuda?
Podemos te ajudar de 2 formas:
A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso:
O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações
que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a
7
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que
interesse ao grupo, favor postá-la aqui.
Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do
curso, é recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais
efetivos para esta prática.
. O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo
para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas
a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem
ajudar.
Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a
formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico
é recomendável ver se a sua pergunta já foi feita por outro participante.
A segunda forma se dá pelas Wikis:
Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par-
ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem
ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um
ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé-
dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por
pessoas de todas as partes do mundo. Acesse-a em português pelos links:
• Página principal da Wiki - http://pt.wikipedia.org/wiki/
Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo!
Primeiros Passos
Para uma melhor aprendizagem é recomendável que você siga os seguintes passos:
• Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar;
• Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das
ferramentas básicas do mesmo;
• Entrar nas lições seguindo a seqüência descrita no Plano de Ensino;
• Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais.
Perfil do Tutor
Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores.
O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos
valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as
idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar.
8
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e,
para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor
ou instrutor:
• fornece explicações claras acerca do que ele espera, e do estilo de classificação que irá
utilizar;
• gosta que lhe façam perguntas adicionais;
• identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por-
que motivo a classificação foi ou não foi atribuída’;
• tece comentários completos e construtivos, mas de forma agradável (em contraste com um
reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de
ameaça e de nervosismo’)
• dá uma ajuda complementar para encorajar um estudante em dificuldade;
• esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente;
• ajuda o estudante a alcançar os seus objetivos;
• é flexível quando necessário;
• mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso,
talvez numa fase menos interessante para o tutor);
• escreve todas as correções de forma legível e com um nível de pormenorização adequado;
• acima de tudo, devolve os trabalhos rapidamente;
9
Parte III
GNU Free Documentation License
10
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
(Traduzido pelo João S. O. Bueno através do CIPSGA em 2001)
Esta é uma tradução não oficial da Licençaa de Documentação Livre GNU em Português
Brasileiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a dis-
tribuição de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso.
Entretanto, nós esperamos que esta tradução ajude falantes de português a entenderem melhor
a GFDL.
This is an unofficial translation of the GNU General Documentation License into Brazilian Por-
tuguese. It was not published by the Free Software Foundation, and does not legally state the
distribution terms for software that uses the GFDL–only the original English text of the GFDL does
that. However, we hope that this translation will help Portuguese speakers understand the GFDL
better.
Licença de Documentação Livre GNU Versão 1.1, Março de 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas
não é permitido alterá-lo.
INTRODUÇÃO
O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no
sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo,
com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém
para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável
pelas modificações feitas por terceiros.
Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do
documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge-
ral (GNU GPL), que é um copyleft para software livre.
Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software
livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que
provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a
manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente
do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin-
cipalmente para trabalhos cujo propósito seja de introdução ou referência.
APLICABILIDADE E DEFINIÇÕES
Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo
detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença.
11
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um
licenciado e é referida como "você".
Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento
ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra
língua.
Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex-
clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do
Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente
nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a
Seção Secundária pode não explicar nada de matemática).
Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci-
onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo.
As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como
sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença.
Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa
Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença.
Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica-
mente, representada num formato cuja especificação esteja disponível ao público geral, cujos
conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores
de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou
(para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de
servir como entrada a formatadores de texto ou para tradução automática para uma variedade
de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato
de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de-
sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é
"Transparente"é chamada de "Opaca".
Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim-
ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML
usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e
projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos
proprietários que podem ser lidos e editados apenas com processadores de texto proprietários,
SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam
disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com
finalidade apenas de saída.
A "Página do Título"significa, para um livro impresso, a página do título propriamente dita,
mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível,
o material que esta Licença requer que apareça na página do título. Para trabalhos que não
tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe-
minente do título do trabalho, precedendo o início do corpo do texto.
12
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
FAZENDO CÓPIAS EXATAS
Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não
comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta
Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres-
cente nenhuma outra condição, quaisquer que sejam, às desta Licença.
Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de
cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com-
pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias,
você também precisa respeitar as condições da seção 3.
Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também
pode exibir cópias publicamente.
FAZENDO CÓPIAS EM QUANTIDADE
Se você publicar cópias do Documento em número maior que 100, e a nota de licença do
Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara
e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e
Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e
legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o titulo com-
pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar
outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas
preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia
exata em outros aspectos.
Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma
legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa
verdadeira, e continuar os outros nas páginas adjacentes.
Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você
precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia
Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente
completa do Documento acessível publicamente em uma rede de computadores, a qual o público
usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de
protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel-
mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar
que esta cópia Transparente vai permanecer acessível desta forma na localização especificada
por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta-
mente ou através de seus agentes ou distribuidores) daquela edição para o público.
É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de
redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você
com uma versão atualizada do Documento.
13
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
MODIFICAÇÕES
Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se-
ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença,
com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição
e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além
disso, você precisa fazer o seguinte na versão modificada:
A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do-
cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados
na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se
o editor original daquela versão lhe der permissão;
B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá-
veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco
dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que
cinco);
C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor;
D. Preservar todas as notas de copyright do Documento;
E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às
outras notas de copyright;
F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público
o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico
abaixo;
G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de
Capa requeridos dados na nota de licença do Documento;
H. Incluir uma cópia inalterada desta Licença;
I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo
pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de
Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o
título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar
um item descrevendo a Versão Modificada, tal como descrito na sentença anterior;
J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma
cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu-
mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção
"Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado
pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira
der sua permissão;
K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da
14
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri-
buidores e/ou dedicatórias dados;
L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em
seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção;
M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão
Modificada;
N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro
título dado a uma Seção Invariante.
Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como
Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar
por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus
títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci-
sam ser diferentes de qualquer outro título de seção.
Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual-
quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por
exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a
definição oficial de um padrão.
Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente
, e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos
de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de
Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade.
Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por
você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode
adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que
adicionou a passagem antiga.
O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus
nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer
Versão Modificada.
COMBINANDO DOCUMENTOS
Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob
os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com-
binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste
todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença.
O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes
Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver
múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de
15
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor
origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste
nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado.
Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver-
sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine
quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as
seções entituladas como "Endosso".
COLETÂNEAS DE DOCUMENTOS
Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados
sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com
uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia
exata de cada um dos Documentos em todos os outros aspectos.
Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob
esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta
Licença em todos os outros aspectos relacionados à cópia exata daquele documento.
AGREGAÇÃO COM TRABALHOS INDEPENDENTES
Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se-
parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver-
são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela
compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros
trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim
compilados, e eles não são trabalhos derivados do Documento.
Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento,
então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa
do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado.
Senão eles precisarão aparecer nas capas de todo o agregado.
TRADUÇÃO
Tradução é considerada como um tipo de modificação, então você pode distribuir traduções
do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções
requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir
traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas
Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in-
clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a
16
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
versão original em Inglês desta Licença, a versão original em Inglês prevalecerá.
TÉRMINO
Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres-
samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen-
ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos
sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta
Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total
acordo com esta Licença.
REVISÕES FUTURAS DESTA LICENÇA
A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen-
tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão
presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja
http://www.gnu.org/copyleft/.
A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar
que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você
tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão
posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o
Documento não especificar um número de Versão desta Licença, você pode escolher qualquer
versão já publicada (não como rascunho) pela Free Software Foundation.
ADENDO: Como usar esta Licença para seus documentos
Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença
no documento e ponha as seguintes notas de copyright e licenças logo após a página de título:
Copyright (c) ANO SEU NOME.
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença
de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft-
ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da
Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li-
cença está inclusa na seção entitulada "Licença de Documentação Livre GNU".
Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de
dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de
Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os
Textos da Quarta Capa.
Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda-
mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre,
17
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
tal como a GNU General Public License, para permitir o seu uso em software livre.
18
Parte IV
Ruby on Rails
19
Capítulo 1
O que é o curso Ruby on Rails
Ruby on Rails, ou simplismente Rails, é um framework para aplicações web desenvolvido
todo na linguagem de programação Ruby. Para vocês, que estão fazendo esse curso, devem está
familiarizados com essa linguagem de programação.
Rails é uma ferramenta muito poderosa na hora de fazer aplicações web, como vocês poderão
ver ao longo do curso.
20
Capítulo 2
Plano de ensino
2.1 Objetivo
Qualificar técnicos e programadores no framework Ruby on Rails
2.2 Público Alvo
Técnicos e Programadores que desejam trabalhar com Ruby on Rails.
2.3 Pré-requisitos
Os usuários deverão ser, necessariamente, indicados por empresas públicas e ter conheci-
mento básico acerca da lógica de programação, HTML, Linguagem Ruby, MySQL e CSS.
2.4 Descrição
O curso de Ruby on Rails será realizado na modalidade EAD e utilizará a plataforma Moodle
como ferramenta de aprendizagem. Ele é composto de um módulo de aprendizado que será dado
na primeira semana e um módulo de avaliação que será dado na segunda semana. O material
didático estará disponível on-line de acordo com as datas pré-estabelecidas no calendário. A
versão utilizada para o Ruby on Rails será a 1.1.
2.5 Metodologia
O curso está dividido da seguinte maneira:
2.6 Cronograma
• Lição 1 - Iniciando o Ruby on Rails;
• Lição 2 - Gerando migrações e modelos de dados;
21
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
• Lição 3 - MVC e CONTROLLER;
• Lição 4 - Layouts e Roteamento;
• Lição 5 - Scaffolding e Validações;
• Lição 6 - Segundo controller;
• Lição 7 - Extendendo um modelo de dados e Helpers.
• Lição 8 - Relacionamentos;
• Lição 9 - Belongs to
• Lição 10 - has many, has one, e has many, through
As lições contém o contéudo principal. Elas poderão ser acessadas quantas vezes forem neces-
sárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá
uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada lição,
pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição for menor
do que 6.0, sugerimos que você faça novamente esta lição.
Ao final do curso será disponibilizada a avaliação referente ao curso. Tanto as notas das lições
quanto a da avaliação serão consideradas para a nota final. Todos os módulos ficarão visíveis
para que possam ser consultados durante a avaliação final.
Aconselhamos a leitura da "Ambientação do Moodle"para que você conheça a plataforma de
Ensino a Distância, evitando dificuldades advindas do "desconhecimento"sobre a mesma.
Os instrutores estarão a sua disposição ao longo de todo curso. Qualquer dúvida deverá ser
enviada no fórum. Diariamente os monitores darão respostas e esclarecimentos.
2.7 Programa
O curso Ruby on Rails oferecerá o seguinte conteúdo:
• Iniciando o Ruby on Rails;
• Gerando migrações e modelos de dados;
• MVC e CONTROLLER;
• Layouts e Roteamento;
• Scaffolding e Validações;
• Segundo controller;
• Extendendo um modelo de dados e Helpers.
• Relacionamentos;
• Belongs to
• has many, has one, e has many, through
22
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
2.8 Avaliação
Toda a avaliação será feita on-line.
Aspectos a serem considerados na avaliação:
• Iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento;
• Capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados.
Instrumentos de avaliação:
• Participação ativa nas atividades programadas.
• Avaliação ao final do curso.
• O participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e
obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo
com a fórmula abaixo:
• Nota Final = ((ML x 7) + (AF x 3)) / 10 = Média aritmética das lições
• AF = Avaliações
2.9 Bibliografia
• Site oficial: http://www.rubyonrails.org;
• Rails para sua diversão e lucro.
• http://forum.rubyonbr.org/forums/4/topics/2503
23
Capítulo 3
Iniciando o Ruby on Rails
Essa lição tem uma parte introdutória ao Rails e a instalação do mesmo.
3.1 Introdução
Ruby on Rails é um poderoso Framework para aplicações web. O curso é voltado para desen-
volvedores já familiarizados com algum ambiente de desenvolvimento Web, seja usando Linux ou
Windows. Por razões de tempo, o curso assume que o desenvolvedor já tenha conhecimento de
pelo menos uma linguagem de programação, de um banco de dados relacional qualquer e que
seja capaz de estabelecer um ambiente para essa linguagem e banco de dados em sua plata-
forma de escolha, ou seja, que tenha o conhecimento técnico para acompanhar os passos dados
no curso sem maiores problemas. O curso não assume, porém, que o desenvolvedor saiba fazer
o mesmo para o Rails e explica isso nos detalhes necessários.
Um certo conhecimento do Ruby é requerido, embora a linguagem seja simples e poderosa
o suficiente para ser inteligível para qualquer desenvolvedor com uma experiência razoável em
outra linguagem de alto nível. Apesar disso, esse tutorial pode não ser tão fácil para desenvolve-
dores que estejam dando os seus primeiros passos em programação e em especial programação
para a Web?embora eu acredite que desenvolvedores iniciantes possam se beneficiar muito com
o contato com uma linguagem mais poderosa e com um framework mais elaborado.
Foi usado nesse curso o MySQL na elaboração do tutorial por ele ser um banco de fácil insta-
lação, mas você pode usar o que mais se adaptar ao seu ambiente, principalmente, considerando
que o Rails esconde a maior parte da complexidade nessa área e que ele suporta os principais
bancos de dados existentes no mercado. Para começar, vamos assumir que você tenha um
banco de dados instalado e que esteja pronto para instalar o Rails e quaisquer outras bibliotecas
necessárias.
Como é bom que você já tenha se familiarizado com a linguagem Ruby (seria útil que você já
tenha feito o nosso curso Linguagem Ruby), a de se supor que você já tenha instalado em sua
máquina o Ruby.
O Ruby é uma linguagem de alto nível, tão completa quanto uma linguagem poderia ser. Sua
sintaxe é bem simples, e lembra Ada e Eiffel, com algumas pitadas de Perl em alguns pontos.
3.2 Instalação
Para verificar a versão instalada do Ruby, use o seguinte comando:
24
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
ronaldo@minerva: $ ruby -v ruby 1.8.4 (2005-12-24) [i486-linux]
Uma vez que o Ruby esteja instalado, é hora de fazer o mesmo com o Rails. O procedimento
é bem simples:
Como usuário root digite: apt-get install rails
Simples assim.
Novas versões do Rails são instalados por um processo similar. Se você já baixou alguma
versão alguma vez, use o mesmo comando acima para atualizar a sua distribuição para a versão
mais recente, lembrando, principalmente, de que a versão 1.1.6 corrige um sério problema de
segurança nas versões anteriores e
deve ser a única usada em um servidor público. Com os passos acima finalizados e um banco
de dados disponível, você está pronto para começar o desenvolvimento em Rails.
A primeira coisa a fazer, então, é criar o diretório de trabalho da aplicação. Isso é feito com o
comando abaixo:
ronaldo@minerva: /tmp$ rails gtd
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
...
O comando rails gera o esqueleto completo de uma aplicação, pronta para rodar. Esse co-
mando foi criado em seu sistema quando você instalou as bibliotecas necessárias.
No esqueleto gerado, cada parte da aplicação tem um local específico para ser colocado.
Isso deriva de uma das filosofias por trás do Rails que pode ser descrita pela frase ?convenção
ao invés de configuração?. Convenção, nesse caso, significa que há um acordo entre o framework
e você, o desenvolvedor, de modo que você não precisa de preocupar com certos detalhes que,
de outra forma, teriam que se descritos em um arquivo de configuração.
25
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
No Rails, basta executar uma determinada ação ou criar um determinado arquivo e as coi-
sas funcionarão da maneira que você deseja e espera automaticamente, sem necessidade de
qualquer trabalho adicional. A princípio isso pode parecer um pouco restritivo, mas na prática
funciona perfeitamente. E sendo extremamente flexível, o Rails permite que você mude qualquer
coisa que precise, quando precisar.
Agora que temos uma aplicação básica, vamos rodá-la e ver o resultado.
Uma das vantagens do Rails é que o ciclo de codificar-rodar-e-testar é bem rápido. Basta fazer
uma alteração para ver imediatamente o resultado, sem a necessidade de recarregar processos,
esperar a compilação da aplicação ou enviá-la para um servidor especialmente preparado. O
máximo que você terá
que fazer no Rails é reiniciar o servidor Web no caso de alguma mudança fundamental na
configuração básica da aplicação, algo que ocorre com pouca freqüência.
Para facilitar a vida, o Rails vem com seu próprio servidor Web, utilizando as bibliotecas do
próprio Ruby. Para rodar o servidor, basta usar um dos scripts utilitários presentes em cada
aplicação gerada pelo Rails (veja o diretório script sob o esqueleto da aplicação).
O comando, executado dentro do diretório da aplicação, é o seguinte:
ronaldo@minerva: /tmp/gtd$ script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
style="text-align: justify; font-family: courier new,courier,monospace; font-weight: bold;»=>
Ctrl-C to shutdown server; call with –help for options
[2006-09-20 10:31:40] INFO WEBrick 1.3.1
[2006-09-20 10:31:40] INFO ruby 1.8.4 (2005-12-24) [i486-linux]
[2006-09-20 10:31:40] INFO WEBrick::HTTPServer#start: pid=8262 port=3000
Como você poder ver, o comando inicia uma instância do servidor WEBrick, capaz de servir
aplicações Rails sem necessidade de qualquer configuração adicional. O servidor roda local-
mente e recebe requisições na porta 3000. Sendo um servidor simples e embutido, o WEBrick
não é capaz de receber requisições
simultâneas, mas permite que testemos perfeitamente a nossa aplicação. Acessando o ende-
reço da aplicação você tem o seguinte:
26
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 1
Como mostrado acima, temos uma aplicação inicial rodando que, inclusive, mostra quais são
os próximos passos para continuar o desenvolvimento da mesma.
3.3 Configurando Banco de Dados
Vamos acatar a sugestão da página inicial e criar e configurar o banco de dados da aplica-
ção. Esse primeiro passo é muito importante porque o Rails usa as informações proveniente
do schema do banco de dados para gerar automaticamente arquivos e configurações adicionais.
Esse é mais um exemplo de convenção ao invés de configuração. Dessa forma, garantir que o
banco está funcionando corretamente, configurado para uso da aplicação, é o passo inicial de
qualquer desenvolvimento em Rails.
O arquivo de configuração de banco de dados se chamada database.yml e está localizado no
diretório config, junto com os demais arquivos de configuração da aplicação.
Esse arquivo, removendo os comentários (as linhas iniciadas com #), tem o seguinte formato
Ú ÐÓÔÑ ÒØ
ÔØ Ö ÑÝ×ÕÐ
27
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ø × Ø Ú ÐÓÔÑ ÒØ
Ù× ÖÒ Ñ ÖÓÓØ
Ô ××ÛÓÖ
Ó×Ø ÐÓ
 Ð Ó×Ø
Ø ×Ø
ÔØ Ö ÑÝ×ÕÐ
Ø × Ø Ø ×Ø
Ù× ÖÒ Ñ ÖÓÓØ
Ô ××ÛÓÖ
Ó×Ø ÐÓ
 Ð Ó×Ø
ÔÖÓ Ù
Ø ÓÒ
ÔØ Ö ÑÝ×ÕÐ
Ø × Ø ÔÖÓ Ù
Ø ÓÒ
Ù× ÖÒ Ñ ÖÓÓØ
Ô ××ÛÓÖ
Ó×Ø ÐÓ
 Ð Ó×Ø
A extensao .yml se refere ao formato do arquivo, que utiliza uma linguagem de domínio cha-
mada YAML. Por hora, basta saber que é uma linguagem de serialização de dados favorecida por
desenvolvedores Ruby e Rails.
Uma aplicação Rails geralmente utiliza três bancos de dados, como demonstrado acima, um
para cada ambiente de desenvolvimento padrão. Um banco de dados é utilizado para o desen-
volvimento, onde todas as mudanças são aplicadas. Esse banco tem seu correspondente em
um banco de produção, onde modificações somente são aplicadas uma vez que estejam comple-
tas. O arquivo permite configurar, inclusive, um banco remoto para onde suas modificações finais
serão redirecionadas?embora geralmente seja melhor utilizar um outro método de implantação,
como veremos mais adiante. O terceiro banco mostrado acima é um banco de testes, utilizado
pelo Rails para a execução de unit testing. Esse banco deve ser mantido necessariamente à
parte já que todos os dados e tabelas presentes no mesmo são excluídos e recriados a cada
teste completo efetuado na aplicação.
Vamos criar o banco agora:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô
ÒØ Ö Ô ××ÛÓÖ
Ï Ð
ÓÑ ØÓ Ø ÅÝËÉÄ ÑÓÒ ØÓÖº ÓÑÑ Ò × Ò Û Ø ÓÖ º
ÓÙÖ ÅÝËÉÄ 
ÓÒÒ 
Ø ÓÒ × ØÓ × ÖÚ Ö Ú Ö× ÓÒ º¼º¾¾¹ Ò ¼Ù ÙÒØÙ º¼ º¾¹ÐÓ
ÌÝÔ ³ ÐÔ ³ ÓÖ ³ ³ ÓÖ ÐÔº ÌÝÔ ³
³ ØÓ 
Ð Ö Ø Ù Öº
ÑÝ×ÕÐ 
Ö Ø Ø × Ø
ÉÙ ÖÝ Çø ½ ÖÓÛ 
Ø ´¼º × 
µ
ÑÝ×ÕÐ 
Ö Ø Ø × Ø Ø ×Ø
ÉÙ ÖÝ Çø ½ ÖÓÛ 
Ø ´¼º ¿ × 
µ
ÑÝ×ÕÐ Ù× Ø
Ø × 
 Ò
ÑÝ×ÕÐ
Modificando o arquivo de configuração para desenvolvimento local (database.yml), teríamos
algo assim:
28
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ú ÐÓÔÑ ÒØ
ÔØ Ö ÑÝ×ÕÐ
Ø × Ø
Ù× ÖÒ Ñ ÖÓÓØ
Ô ××ÛÓÖ
Ó×Ø ÐÓ
 Ð Ó×Ø
×Ó
 Ø »Ú Ö»ÖÙÒ»ÑÝ×ÕÐ »ÑÝ×ÕÐ º×Ó
Ø ×Ø
ÔØ Ö ÑÝ×ÕÐ
Ø × Ø Ø ×Ø
Ù× ÖÒ Ñ ÖÓÓØ
Ô ××ÛÓÖ
Ó×Ø ÐÓ
 Ð Ó×Ø
×Ó
 Ø »Ú Ö»ÖÙÒ»ÑÝ×ÕÐ »ÑÝ×ÕÐ º×Ó
ÔÖÓ Ù
Ø ÓÒ
Ú ÐÓÔÑ ÒØ
No caso acima, eu configurei os banco de produção e desenvolvimento para apontarem para
o mesmo local já que o desenvolvimento está limitado à minha máquina. Essa é uma estratégia
interessante a usar quando queremos testar uma aplicação nas duas situações localmente sem
nos preocuparmos em copiar o banco a todo momento?mesmo que o Rails permita isso com
pouco mais do que alguns comandos. Eu precisei também acrescentar o método de transporte
socket à configuração já que em minha máquina, especificamente, o MySQL não permite cone-
xões de rede em sua configuração padrão. Outros tipos bancos de dados são configurados de
maneira similar, mudando o parâmetro adapter e quaisquer outras configurações necessárias.
Uma maneira mais simples de gerar uma arquivo de configuração específico para o banco de da-
dos que você está usando é já invocar o comando para gerar o esqueleto da aplicação passando
um parâmetro para isso. Por exemplo:
rails –database=oracle gtd
O comando acima gera o mesmo esqueleto da aplicação, com a única diferença de que o
arquivo database.yml será um pouco diferente para levar em conta as diferenças do Oracle. Vol-
tando à nossa aplicação, como um arquivo de configuração importante foi mudado, o servidor
Web precisa ser reiniciado. Isso acontece porque ele somente lê essas configurações no início
de execução. Esse é um dos raros casos em que um servidor de desenvolvimento precisa ser
reiniciado já que o Rails recarrega praticamente qualquer modificação feita na aplicação quando
está no modo de desenvolvimento.
Agora temos uma aplicação e um banco de dados configurado. Com isso já podemos iniciar
o processo de desenvolvimento propriamente dito.
Para acesso ao banco de dados, o Rails usa classes de dados conhecidas como models, ou
modelos de dados. Essas classes mascaram os detalhes ¨sórdidos¨do acesso ao banco de dados
providenciando uma interface fácil e intuitiva ao desenvolvedor. Em qualquer aplicação, teremos
pelo menos um modelo de dados para utilizar na mesma. E a maneira mais fácil de fazer isso é
criar automaticamente a tabela no banco de dados, utilizando um dos scripts do Rails.
O Rails automaticamente entende que todas as tabelas criadas no banco para uso em mode-
los, ou classes de dados, satisfarão a duas condições: terão um nome plural em inglês e terão
29
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
uma chave primária surrogada inteira e auto-incrementada chamada id. É possível mudar ambas
as condições, mas inicialmente ficaremos com elas para não ter que modificar o que o Rails gera
e usa automaticamente.
Para facilitar o desenvolvimento, a aplicação desenvolvida está em inglês, que espero seja
simples o suficiente mesmo para a compreensão do leitor que não domine plenamente este idi-
oma. Considerando a profusão de termos em inglês em nossa área acho que isso não será um
problema. O uso do inglês evita que tenhamos que pensar em alguns detalhes de tradução e
globalização enquanto estamos aprendendo o Rails. Mais no fim do tutorial explicaremos como
mudar algumas das coisas que o Rails por como padrão.
30
Capítulo 4
Gerando Migrações e Modelos de
Dados
Essa lição tem como objetivo mostrar como alterar qualquer natureza no banco de dados.
4.1 Gerando Migrações e Modelos de dados I
Para manter portabilidade e facilitar o controle de versionamento do banco de dados, o Rails
utiliza algo chamado migrations (migrações). São scripts em Ruby descrevendo modificações de
qualquer natureza no banco de dados. Migrações são a maneira mais fácil de acrescentar tabelas
e classes de dados ao Rails e é o que utilizaremos agora. A primeira tabela que vamos criar será
a tabela de contextos. Contextos, no GTD, são, basicamente, os ambientes onde uma ação será
executada, como, por exemplo, casa, escritório, e-mail, telefone, etc. Vamos gerar então uma
migração para essa primeira modificação no banco:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø Ñ Ö Ø ÓÒ 
Ö Ø 
ÓÒØ ÜØ×

Ö Ø »Ñ Ö Ø

Ö Ø »Ñ Ö Ø »¼¼½ 
Ö Ø 
ÓÒØ ÜØ׺Ö
O script generate é uma das ferramentas cruciais do Rails que utilizaremos ao longo de todo
nosso curso, sendo usado, como o nome indica, para criar basicamente qualquer estrutura que
precisamos em uma aplicação. O seu primeiro parâmetro é o tipo de objeto que estamos ge-
rando, seu segundo parâmetro é o nome desse objeto e quaisquer outros parâmetro adicionais
indicam opções de geração. No caso acima, estamos gerando uma migração, cujo nome é cre-
ate_contexts.
No Rails, existem muitas convenções quanto ao uso de nomes, que são seguidas pelos
comandos do mesmo, com conversões automáticas quando necessário. No caso acima, por
exemplo, o nome que usamos será automaticamente convertido em um nome de classe, que
no Ruby são expressas com capitalização alternada, como você poderá ver abaixo. O resultado
do comando é um arquivo novo, prefixado pela versão da migração, que foi criado no diretório
db/migrate. Esse prefixo é usado para controlar quais alterações um banco precisa sofrer para
chegar a uma versão específica. Editando o arquivo, temos o seguinte:

Ð ×× Ö Ø ÓÒØ ÜØ× 
Ø Ú Ê 
ÓÖ Å Ö Ø ÓÒ
× Ð ºÙÔ
31
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ò
× Ð º ÓÛÒ
Ò
Ò
O Rails criou uma classe derivada () da classe ActiveRecord::Migration com dois métodos.
Esses métodos, por estarem prefixados por self, indicam no Ruby que os mesmos podem ser
chamados diretamente na classe (métodos estáticos na terminologia do C++, C# e do Java), sem
necessidade de uma instância. O método self.up é utilizado para efetuar as modificações. O
seu oposto, self.down, é usado para desfazer essas modificações caso você esteja revertendo
para uma versão anterior do banco. Dependendo da forma como os métodos forem escritos, eles
serão realmente complementares. Obviamente é possível que modificações sejam efetuadas que
não são reversíveis. Nesse caso, o Rails emitirá um erro se uma migração para uma versão mais
baixa for tentada. Vamos editar o arquivo agora para incluir a tabela que desejamos criar:

Ð ×× Ö Ø ÓÒØ ÜØ× 
Ø Ú Ê 
ÓÖ Å Ö Ø ÓÒ
× Ð ºÙÔ

Ö Ø Ø Ð 
ÓÒØ ÜØ× Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
Ò
Ò
× Ð º ÓÛÒ
ÖÓÔ Ø Ð 
ÓÒØ ÜØ×
Ò
Ò
Para efetuar suas migrações, o Rails utiliza uma linguagem de domínio que permite especificar
operações de banco de dados de forma abstrata, que não está presa a um servidor específico.
É possível executar operações diretamente via SQL no banco, mas isso não é recomendado por
quebrar essa abstração.
No caso acima, o método create_table dentro de self.up serve para especificar a tabela que
será criada. Esse método recebe um bloco como parâmetro (indicado pela palavra-chave do) que
especifica as colunas que serão adicionadas.
Blocos são uma das partes mais interessantes do Ruby e vale a estudar um pouco o que eles
podem fazer já que o uso dos mesmos é extenso em qualquer aplicação na linguagem, incluindo o
Rails. No Ruby, os blocos são valores de primeira classe, que pode ser atribuídos e manipulados
como qualquer outro objeto.
Um outro detalhe a manter em mente é o uso extensivo de símbolos no Ruby. No caso acima,
o próprio nome da tabela é denotado por um símbolo. Símbolos são similares a strings, com a
diferença fundamental que são internalizados e existem com uma única instância que permite um
uso transparente e eficiente dos mesmos.
Voltando ao nosso código, como a tabela terá somente uma coluna inicialmente, que é o nome
do contexto, somente precisamos de uma linha, identificando o nome da coluna e seu tipo. Mais à
frente veremos outros tipos e opções. O método self.down, como explicando, realiza a operação
inversa destruindo a tabela.
Agora é hora de aplicar essa migração ao banco, subindo sua versão. Para isso, temos o
utilitário rake, que é parte do Ruby. O rake é o equivalente Ruby do make, sendo capaz de realizar
tarefas descritas em um Rakefile, da mesma forma que o make faz uso de um Makefile. O Rails
32
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
vem com seu próprio Rakefile que permite a execução de várias de suas tarefas necessárias,
incluindo db:migrate, que aplica as migrações ainda não efetuadas a um banco. Rodamos o
comando da seguinte forma:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° Ö Ñ Ö Ø
´ Ò »ØÑÔ» Ø µ
Ö Ø ÓÒØ ÜØ× Ñ Ö Ø Ò
¹¹ 
Ö Ø Ø Ð ´ 
ÓÒØ ÜØ×µ
¹ ½º¾¼ ×
Ö Ø ÓÒØ ÜØ× Ñ Ö Ø ´½º¾¼ ¾×µ
Se observamos o banco agora, teremos o seguinte schema:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø
ÑÝ×ÕÐ × ÓÛ Ø Ð ×
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
Ì Ð × Ò Ø
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·

ÓÒØ ÜØ×
×
 Ñ Ò Ó
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
¾ ÖÓÛ× Ò × Ø ´¼º¼¼ × 
µ
Duas tabelas foram criadas, contexts e schema_info. A primeira é a que especificamos. A
segunda descreve informações do banco para o Rails, para controlar o versionamento do mesmo.
A tabela contexts ficou assim:
Ó ÒÚÑ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô
ÑÝ×ÕÐ ×
Ö 
ÓÒØ ÜØ×
·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
Ð ÌÝÔ ÆÙÐÐ Ã Ý ÙÐØ ÜØÖ
·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
ÒØ´½½µ ÆÇ ÈÊÁ ÆÍÄÄ ÙØÓ Ò
Ö Ñ ÒØ
Ò Ñ Ú Ö
 Ö´¾ µ Ë ÆÍÄÄ
·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
¾ ÖÓÛ× Ò × Ø ´¼º¼¼ × 
µ
Como você pode ver, não é preciso especificar a chave primária surrogada, que é automati-
camente criada pelo Rails. A tabela schema_info possui os seguintes dados:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø
ÑÝ×ÕÐ × Ð 
Ø ¶ ÖÓÑ ×
 Ñ Ò Ó
·¹¹¹¹¹¹¹¹¹·
Ú Ö× ÓÒ
·¹¹¹¹¹¹¹¹¹·
½
·¹¹¹¹¹¹¹¹¹·
½ ÖÓÛ Ò × Ø ´¼º¼¼ × 
µ
33
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Esse número de versão será incrementado ou decrementado dependendo da direção da mi-
gração.
A migração também criou o arquivo db/schema.rb, contendo uma representação do banco em
Ruby, que pode ser usada para recriar a estrutura do mesmo em qualquer banco suportado pelo
Rails, usando uma outra tarefa do rake.
O arquivo é auto-gerado e não deve ser modificado manualmente. Seu formato pode ser visto
abaixo:
Ì × Ð × ÙØÓ Ò Ö Ø º ÁÒ×Ø Ó Ø Ò Ø × Ð ¸ ÔÐ × Ù× Ø
Ñ Ö Ø ÓÒ× ØÙÖ Ó 
Ø Ú Ê 
ÓÖ ØÓ Ò
Ö Ñ ÒØ ÐÐÝ ÑÓ Ý ÝÓÙÖ Ø × ¸ Ò
Ø Ò Ö Ò Ö Ø Ø × ×
 Ñ Ò Ø ÓÒº

Ø Ú Ê 
ÓÖ Ë
 Ñ º Ò ´ Ú Ö× ÓÒ ½µ Ó

Ö Ø Ø Ð 
ÓÒØ ÜØ× ¸ ÓÖ
 ØÖÙ Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
Ò
Ò
Note apenas que essa representação é limitada às tabelas em si e não inclui chaves es-
trangeiras, triggers ou stored procedures. O próximo passo agora é criar a classe de dados
correspondente à tabela. Para isso, usamos o comando abaixo:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø ÑÓ Ð 
ÓÒØ ÜØ
Ü ×Ø× ÔÔ»ÑÓ Ð×»
Ü ×Ø× Ø ×Ø»ÙÒ Ø»
Ü ×Ø× Ø ×Ø» ÜØÙÖ ×»

Ö Ø ÔÔ»ÑÓ Ð×»
ÓÒØ ÜغÖ

Ö Ø Ø ×Ø»ÙÒ Ø»
ÓÒØ ÜØ Ø ×غÖ

Ö Ø Ø ×Ø» ÜØÙÖ ×»
ÓÒØ ÜØ׺ÝÑÐ
Ü ×Ø× »Ñ Ö Ø
ÒÓØ Ö Ñ Ö Ø ÓÒ × ÐÖ Ý Ò Ñ 
Ö Ø 
ÓÒØ ÜØ× »Ñ Ö Ø »¼¼½ 
Ö Ø 
ÓÒØ ÜØ׺Ö
O Rails utiliza uma estratégia de desenvolvimento (conhecidas como patterns de maneira
geral) chamada de MVC (Model-View-Controller). Essa estratégia separa os componentes da
aplicação em partes distintas que não só facilitam o desenvolvimento como também facilitam a
manutenção. O que estamos vendo no momento são os models, que correspondem à camada de
acesso ao banco de dados, implementada no Rails por um componente denominado ActiveRe-
cord. O comando acima gera toda estrutura de suporte ao modelo, incluindo testes e migrações
para o mesmo. Como geramos a nossa migração inicial manualmente, o Rails nos informa que
já existe uma com o mesmo nome que ele pretendia gerar e que ele está pulando esse passo.
O arquivo responsável pela implementação do modelo está em app/model/context.rb e contém
apenas o seguinte:

Ð ×× ÓÒØ ÜØ 
Ø Ú Ê 
ÓÖ ×
Ò
Essas duas linhas, apoiadas pelo Rails, já providenciam uma riqueza de implementação que
nos permite recuperar, inserir e atualizar dados no banco, e executar uma série de outras opera-
ções complexas sem a necessidade de qualquer comando SQL direto.
Vamos criar agora um novo modelo correspondendo à tabela de projetos. Vamos deixar que
o Rails gere a migração dessa vez. O comando é:
34
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø ÑÓ Ð ÔÖÓ 
Ø
Ü ×Ø× ÔÔ»ÑÓ Ð×»
Ü ×Ø× Ø ×Ø»ÙÒ Ø»
Ü ×Ø× Ø ×Ø» ÜØÙÖ ×»

Ö Ø ÔÔ»ÑÓ Ð×»ÔÖÓ 
غÖ

Ö Ø Ø ×Ø»ÙÒ Ø»ÔÖÓ 
Ø Ø ×غÖ

Ö Ø Ø ×Ø» ÜØÙÖ ×»ÔÖÓ 
Ø׺ÝÑÐ
Ü ×Ø× »Ñ Ö Ø

Ö Ø »Ñ Ö Ø »¼¼¾ 
Ö Ø ÔÖÓ 
Ø׺Ö
Você pode ver que o Rails gerou um template da migração, e basta editá-la:

Ð ×× Ö Ø ÈÖÓ 
Ø× 
Ø Ú Ê 
ÓÖ Å Ö Ø ÓÒ
× Ð ºÙÔ

Ö Ø Ø Ð ÔÖÓ 
Ø× Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
Ò
Ò
× Ð º ÓÛÒ
ÖÓÔ Ø Ð ÔÖÓ 
Ø×
Ò
Ò
O arquivo final seria, com base no que pensamos até o momento:

Ð ×× Ö Ø ÈÖÓ 
Ø× 
Ø Ú Ê 
ÓÖ Å Ö Ø ÓÒ
× Ð ºÙÔ

Ö Ø Ø Ð ÔÖÓ 
Ø× Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
غ
ÓÐÙÑÒ ×
Ö ÔØ ÓÒ¸ Ø ÜØ
Ò
Ò
× Ð º ÓÛÒ
ÖÓÔ Ø Ð ÔÖÓ 
Ø×
Ò
Ò
Você não precisa se preocupar em criar todos os campos inicialmente. Você pode sempre
usar outra migração para isso. Rodando o comando rake para carregar as migrações mais uma
vez, temos o seguinte:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° Ö Ñ Ö Ø
´ Ò » ÓÑ »ÖÓÒ Ð Ó»ØÑÔ» Ø µ
Ö Ø ÈÖÓ 
Ø× Ñ Ö Ø Ò
¹¹ 
Ö Ø Ø Ð ´ ÔÖÓ 
Ø×µ
¹ ¼º½ ¿×
Ö Ø ÈÖÓ 
Ø× Ñ Ö Ø ´¼º½ ×µ
O resultado final do banco seria:
35
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø
ÑÝ×ÕÐ × ÓÛ Ø Ð ×
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
Ì Ð × Ò Ø
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·

ÓÒØ ÜØ×
ÔÖÓ 
Ø×
×
 Ñ Ò Ó
·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
¿ ÖÓÛ× Ò × Ø ´¼º¼¼ × 
µ
ÑÝ×ÕÐ ×
Ö ÔÖÓ 
Ø×
·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
Ð ÌÝÔ ÆÙÐÐ Ã Ý ÙÐØ ÜØÖ
·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
ÒØ´½½µ ÆÇ ÈÊÁ ÆÍÄÄ ÙØÓ Ò
Ö Ñ ÒØ
Ò Ñ Ú Ö
 Ö´¾ µ Ë ÆÍÄÄ
×
Ö ÔØ ÓÒ Ø ÜØ Ë ÆÍÄÄ
·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹·
¿ ÖÓÛ× Ò × Ø ´¼º¼¼ × 
µ
ÑÝ×ÕÐ × Ð 
Ø ¶ ÖÓÑ ×
 Ñ Ò Ó
·¹¹¹¹¹¹¹¹¹·
Ú Ö× ÓÒ
·¹¹¹¹¹¹¹¹¹·
¾
·¹¹¹¹¹¹¹¹¹·
½ ÖÓÛ Ò × Ø ´¼º¼¼ × 
µ
E o arquivo db/schema.rb agora contém:
Ì × Ð × ÙØÓ Ò Ö Ø º ÁÒ×Ø Ó Ø Ò Ø × Ð ¸ ÔÐ × Ù× Ø
Ñ Ö Ø ÓÒ× ØÙÖ Ó 
Ø Ú Ê 
ÓÖ ØÓ Ò
Ö Ñ ÒØ ÐÐÝ ÑÓ Ý ÝÓÙÖ Ø × ¸ Ò
Ø Ò Ö Ò Ö Ø Ø × ×
 Ñ Ò Ø ÓÒº

Ø Ú Ê 
ÓÖ Ë
 Ñ º Ò ´ Ú Ö× ÓÒ ¾µ Ó

Ö Ø Ø Ð 
ÓÒØ ÜØ× ¸ ÓÖ
 ØÖÙ Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
Ò

Ö Ø Ø Ð ÔÖÓ 
Ø× ¸ ÓÖ
 ØÖÙ Ó Ø
غ
ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò
غ
ÓÐÙÑÒ ×
Ö ÔØ ÓÒ ¸ Ø ÜØ
Ò
Ò
Para terminar, vamos gerar a tabela e o modelo de ações:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø ÑÓ Ð 
Ø ÓÒ
Ü ×Ø× ÔÔ»ÑÓ Ð×»
Ü ×Ø× Ø ×Ø»ÙÒ Ø»
36
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ü ×Ø× Ø ×Ø» ÜØÙÖ ×»

Ö Ø ÔÔ»ÑÓ Ð×» 
Ø ÓÒºÖ

Ö Ø Ø ×Ø»ÙÒ Ø» 
Ø ÓÒ Ø ×غÖ

Ö Ø Ø ×Ø» ÜØÙÖ ×» 
Ø ÓÒ׺ÝÑÐ
Ü ×Ø× »Ñ Ö Ø

Ö Ø »Ñ Ö Ø »¼¼¿ 
Ö Ø 
Ø ÓÒ׺Ö
A migração para o modelo seria:

Ð ×× Ö Ø 
Ø ÓÒ× 
Ø Ú Ê 
ÓÖ Å Ö Ø ÓÒ
× Ð ºÙÔ

Ö Ø Ø Ð 
Ø ÓÒ× Ó Ø
غ
ÓÐÙÑÒ ×
Ö ÔØ ÓÒ¸ ×ØÖ Ò
غ
ÓÐÙÑÒ ÓÒ ¸ ÓÓÐ Ò
غ
ÓÐÙÑÒ 
Ö Ø Ø¸ Ø Ø Ñ
غ
ÓÐÙÑÒ 
ÓÑÔÐ Ø Ø¸ Ø Ø Ñ
غ
ÓÐÙÑÒ 
ÓÒØ ÜØ ¸ ÒØ Ö
غ
ÓÐÙÑÒ ÔÖÓ 
Ø ¸ ÒØ Ö
Ò
Ò
× Ð º ÓÛÒ
ÖÓÔ Ø Ð 
Ø ÓÒ×
Ò
Ò
Com isso, já temos agora o suficiente em nosso banco de dados para trabalhar um pouco em
nossa aplicação.
Um recurso muito útil do Rails é o console, que serve tanto para experimentar com as clas-
ses de dados como para executar uma série de outras funções úteis de teste e manutenção da
aplicação. Para acessar o controle, use o seguinte comando:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ»
ÓÒ×ÓÐ
ÄÓ Ò Ú ÐÓÔÑ ÒØ ÒÚ ÖÓÒÑ Òغ
Obs.: Para executar esse comando é necessário que você tenha instalado o pacote irb.
A exemplo de um console de comando do DOS ou do próprio MySQL, o console do Rails
permite que você insira um comando e veja seus resultados imediatamente:
Por exemplo:
ÓÒØ Üغ
Ö Ø ´ Ò Ñ ³ÀÓÑ ³µ
ÓÒØ ÜØ ¼Ü ¿
 Ò Û Ö 
ÓÖ Ð× ¸  ÖÖÓÖ× 
Ø Ú Ê 
ÓÖ ÖÖÓÖ× ¼Ü 
 × ÓÒØ ÜØ ¼Ü ¿
 ººº ¸  ÖÖÓÖ× ß ¸  ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½
O comando acima cria e salva um novo contexto, recebendo como parâmetro o nome do
mesmo, descrito por seu único atributo. O resultado, visto logo depois do comando, é uma repre-
sentação textual da classe.
Todos objetos em Ruby, e isso inclui desde números inteiros a classe complexas, possuem
uma representação textual. Na maior parte dos casos, o Ruby gera uma representação textual
37
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
automática para classes que não especificam a sua própria representação e é isso o que você
está vendo acima.
Em uma aplicação, você provavelmente precisará criar um objeto e manipulá-lo antes de
salvá-lo. Isso também é possível, como demonstrado abaixo:

ÓÒØ ÜØ ÓÒØ ÜØºÒ Û
ÓÒØ ÜØ ¼Ü ½ ¼ Ò Û Ö 
ÓÖ ØÖÙ ¸  ØØÖ ÙØ × ß Ò Ñ Ò Ð

ÓÒØ ÜØºÒ Ñ ³ÏÓÖ ³
ÏÓÖ

ÓÒØ ÜØº× Ú
ØÖÙ
No exemplo acima, o objeto é criado, uma de suas propriedade é atribuída e depois disso
o objeto é salvo. A persistência de dados só ocorre na invocação do método save. Outras
operações são possíveis:
ÓÒØ Üغ Ò ´ Ðе
ÓÒØ ÜØ ¼Ü  ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ ¸ ÓÒØ ÜØ ¼Ü
 ØØÖ ÙØ × ß Ò Ñ ÏÓÖ ¸ ¾ ℄
ÓÒØ Üغ Ò ´¾µ
ÓÒØ ÜØ ¼Ü ¾¿¾  ØØÖ ÙØ × ß Ò Ñ ÏÓÖ ¸ ¾
ÓÒØ Üغ Ò ´ Ö×ظ 
ÓÒ Ø ÓÒ× ³Ò Ñ Ð ³¸ ³ÀÓÑ ³℄µ
ÓÒØ ÜØ ¼Ü 

  ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½
A primeira chamada acima retorna todos os registros correspondente aos contextos. Vemos
que o resultado é um array, delimitado por []. A segunda chamada, por sua vez, retorna o objeto
especificado pelo id passado, ou seja, por sua chave primária surrogada. O terceiro método, por
fim, retorna o primeiro registro satisfazendo as condições passadas.
O método find possui vários outros parâmetros que servem para gerar queries complexas sem
esforço, ordenando o resultado, limitando a quantidade de itens retornados, e, para usos mais
avançados, criando joins automaticamente. Veremos exemplos extensos disso mais adiante.
A sofisticação das classes geradas pelo ActiveRecord se estende ao ponto da criação de
métodos automáticos para várias situações. Algumas delas exploraremos depois, mas vale a
pena notar aqui pelo menos uma delas: métodos de busca e criação automáticos.
Por exemplo, é possível executar o comando abaixo para encontrar um contexto pelo seu
nome:
ÓÒØ Üغ Ò Ý Ò Ñ ´³ÀÓÑ ³µ
ÓÒØ ÜØ ¼Ü 
  ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½
O método find_by_name não existia até ser chamado. Isso pode ser visto verificando a exis-
tência do método, usando respond_to?, que é um método presente em todas as classes Ruby
e, ao receber um símbolo que especifica o nome do método a ser testado, devolve uma valor
indicando se a classe suporta o método ou não:
ÓÒØ ÜØºÖ ×ÔÓÒ ØÓ ´ Ò Ý Ò Ñ µ
38
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ð×
ÓÒØ Üغ Ò Ý Ò Ñ ´³ÀÓÑ ³µ
ÓÒØ ÜØ ¼Ü ¼
  ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½
Como é fácil perceber, a classe não possui aquele método até que ele seja invocado. Uma
classe de dados Rails aceita combinações quaisquer de seus atributos e de algumas operações
para gerar esse tipo de métodos.
Um exemplo é find_or_create_by_name, que procuraria um registro e o criaria caso não
fosse encontrado, com o nome passado como parâmetro. Se a classe possuir mais atribu-
tos, poderíamos muito bem usar algo como find_or_create_by_name_and_description ou ainda
find_by_description_and_completed_at.
É claro que se usarmos isso para todas as chamadas, teremos métodos com nomes absurda-
mente longos como find_or_create_by_description_and_created_at_and_completed_at_and_done
que ficariam bem melhor como chamadas separadas usando condições por questões de legibili-
dade.
O que estamos fazendo aqui no console é basicamente o que faremos em uma aplicação no
que tange à manipulação de dados. Como você pode ver, na maior parte dos casos, o Rails
não exige que o desenvolvedor escreva código SQL, gerando o código necessário por trás das
cenas, com toda eficiência possível. E caso seja necessário, há ainda duas possilidades: usar
parâmetros mais avançados do método find, que permitem a inserção de fragmentos de SQL em
uma operação qualquer; ou ainda, usar métodos como find_by_sql que permitem um execução
direta no banco com integração plena com o Rails.
Usar as facilidades do Rails não significa que o desenvolvedor não precisa conhecer SQL;
ao contrário, o conhecimento é fundamental, tanto para evitar problemas no uso do próprio Rails
como para todas outras tarefas que existem além do Rails.
Agora que já trabalhamos um pouco com o modelo de dados, vamos passar para a aplicação
em si.
39
Capítulo 5
MVC e CONTROLLER
Essa lição tem como objetivo explicar o que se trata o MVC e como fazer o primeiro CON-
TROLLER
5.1 MVC
Como mencionado anteriormente, o Rails utilizado a estratégia MVC. A parte correspondente
ao Model existe nas classes de dados e é implementada pelo ActiveRecord. Um segundo compo-
nente do Rails, o ActionPack, implementa o V e o C que são respectivamente View e Controller.
Um controller é uma classe responsável por receber as requisições feitas pela aplicação e
executar as ações necessárias para atender essas requisições. Essas ações, ao serem executa-
das, provavelmente causarão mudanças no banco que serão efetuadas, por sua vez, por uma ou
mais classes de dados.
Finalmente, o resultado será exibido através de uma view, que será retornada ao usuário na
forma de HTML, imagens, XML, ou qualquer outra saída aceitável da aplicação.
As três partes da estratégia MVC são independentes no Rails como deveriam ser em qual-
quer boa implementação das mesmas. Qualquer modelo de dados pode ser utilizado indepen-
dentemente, inclusive em scripts que não tem a ver com a aplicação Web em si, como, por
exemplo, tarefas agendadas. Os controllers também são independentes e podem ser usado para
simplesmente efetuar ações que nem mesmo retornam views, atualizando somente o banco ou
disparando outro processo qualquer no servidor. As views são, de certa forma, a parte mais de-
pendente já que, embora podendo ser utilizadas separadamente, não fazem muito sentido sem
utilizarem dados gerados por modelos de dados e controllers.
Para identificar qual controller será responsável por atender uma determinada solicitação da
aplicação, o Rails utiliza uma mecanismo de roteamento de requisições automático que não ne-
cessita de configurações complexas, mas que pode também ser customizado de acordo com as
necessidades de cada aplicação.
A regra principal de roteamento no Rails forma URLs segundo o padrão /controller/action/id,
onde controller é a classe responsável por atender a requisição especificada por aquela URL,
action é um método dentro da classe e id é um parâmetro opcional passado para identificar um
objeto qualquer sobre o qual a ação será efetuada. Como dito anteriormente, esse padrão pode
ser modificado e veremos mais sobre isso adiante no tutorial.
40
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
5.2 O primeiro controller
Vamos começar criando um controller para lidar com a página inicial de nossa aplicação. Para
gerar um controller, usamos o comando abaixo:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø 
ÓÒØÖÓÐÐ Ö ÓÑ
Ü ×Ø× ÔÔ»
ÓÒØÖÓÐÐ Ö×»
Ü ×Ø× ÔÔ» ÐÔ Ö×»

Ö Ø ÔÔ»Ú Û×» ÓÑ
Ü ×Ø× Ø ×Ø» ÙÒ
Ø ÓÒ Ð»

Ö Ø ÔÔ»
ÓÒØÖÓÐÐ Ö×» ÓÑ 
ÓÒØÖÓÐÐ ÖºÖ

Ö Ø Ø ×Ø» ÙÒ
Ø ÓÒ Ð» ÓÑ 
ÓÒØÖÓÐÐ Ö Ø ×غÖ

Ö Ø ÔÔ» ÐÔ Ö×» ÓÑ ÐÔ ÖºÖ
O nome passado para o comando é home, que será usado para compor todos os arquivos
gerados pelo mesmo. Da mesma forma que nos modelos de dados, o Rails cria unit tests para
a classe gerada, que podem ser executados com o comando rake tests. Esse comando roda
todos os unit tests presentes na aplicação e qualquer boa aplicação desenvolvida segundo a
metodologia Extreme Programming faz uso extensivo dessa técnica. Veremos esse assunto em
mais detalhes em uma outra seção de nosso tutorial. Se você acessar a URL desse controller
agora, você vai receber a seguinte tela:
Figura 2
41
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Repare que, nesse caso, eu informei somente /controller/ como a URL, sem passar nem
a parte correspondente a uma ação ou a um id. Nesse caso, o Rails assume que estamos
invocando a ação index sem id. Esse é um mais exemplo de convenção ao invés de configuração.
Ao invés de ter sempre que especificar uma ação padrão em algum lugar, o Rails convenciona
que a ação padrão é index, poupando o desenvolvedor sem afetar a aplicação.
Vamos olhar o arquivo app/controllers/home_controller.rb gerado por nosso comando. Como
já mencionamos, o Rails segue uma estrutura fixa de diretórios, poupando mais uma vez o de-
senvolvedor. Arquivos relacionados ao banco vão em no diretório db, arquivos de configuração
em config e tudo relacionado a MVC vai em app. Dentro de app temos vários outros diretórios
que contém mais partes específicas da aplicação. Em alguns casos, o Rails também adiciona
um sufixo ao arquivo, evitando colisões de nomes e problemas estranhos na aplicação, como é o
caso aqui. O arquivo do controller criado contém o seguinte:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ò
A classe HomeController define quem que irá responder a requisições padrão em /home.
Ela herda da classe ApplicationController, que está definida no arquivo application.rb, no mesmo
diretório. Sendo assim, qualquer método criado na classe ApplicationController estará automati-
camente disponível nos controllers gerados para a aplicação.
O uso de herança serve mais uma vez para beneficiar o desenvolvedor que pode utilizar um
modelo mental familiar para trabalhar sua aplicação, um modelo que é ao mesmo tempo simples
e poderoso.
Para criarmos a ação index, basta adicionarmos um método à classe:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ò Ü
Ò
Ò
O princípio que usamos acima é comum a tudo em Rails. Basicamente tudo o que fazemos
em uma aplicação usando o mesmo consiste em extender alguma classe por meio da adição de
métodos customizados. Recarregando a página no navegador, ficamos com o seguinte:
42
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 3
Vamos que, dessa vez, o Rails identificou a ação a ser executada, mas, como a aplicação
não especificou nenhum retorno, houve um erro. Isso aconteceu porque o Rails tentou aplicar
automaticamente uma view para aquela ação do controller. Como a view ainda não existe, temos
o erro. Antes de nos aventurarmos em uma view usando o mecanismo de templates do Rails,
vamos retornar algum texto por contra própria:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ò Ü
Ö Ò Ö Ø ÜØ ÇÐ
Ò
Ò
O método render, disponível para qualquer controller ou view, gera saída na aplicação, saída
esta que depende de seus parâmetros. No caso acima, estamos renderizando texto puro, como
indicado pelo parâmetro text.
Nossa página agora ficaria assim:
43
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 4
Temos a nossa primeira saída em uma aplicação Rails.
Como escrever manualmente toda a saída não é o que queremos, vamos criar a nossa pri-
meira view. Para isso, criamos o arquivo app/views/home/index.rhtml. A extensão .rhtml indica
que esse arquivo contém HTML e código Ruby.
Uma outra extensão possível seria .rjs para gerar retorno em JavaScript, comumente utilizado
em aplicações Ajax. Há ainda .rxml, para gerar saída em XML. Outros mecanismos de tem-
plate podem usar outras extensões, já que o Rails pode ser configurado para outros mecanismos
alternativos.
Por hora, usaremos a linguagem de templates padrão do Rails. Vamos criar o seguinte ar-
quivo, então:
Ô ÇÐ ¸ ÑÙÒ Ó »Ô
Se recarregamos a página, notaremos que nada mudou. Isso acontece porque estamos
usando render diretamente. Nesse caso, o Rails detecta que alguma saída já foi gerada e não
tenta gerar outra. Basta, então, remover a chamada a render método index, voltando o arquivo a:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
44
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ò Ü
Ò
Ò
Agora, recarregando a página, temos:
Figura 5
Sem que haja necessidade de especificar qualquer coisa, o Rails está usando o arquivo ade-
quado. Veja que não configuramos qualquer coisa. Criamos um controller, definimos um método
no mesmo, e criamos um arquivo que contém o que queremos que seja retornado por aquele
método. A simples existência desses arquivos representa uma cadeia de execução sem que
precisamos nos preocupar com que parte da aplicação faz isso ou aquilo.
Qualquer outra ação que fosse criada dentro desse controller seguiria o mesmo padrão. O
nome da ação seria associado a um nome de arquivo dentro de um diretório em app/views cujo
nome seria o do próprio controller. O Rails também é inteligente ao ponto de responder a uma
ação mesmo que o método não exista, desde que a view esteja presente no diretório correto.
45
Capítulo 6
Layouts e Roteamento
Essa lição tem como finalidade facilitar o desenvolvimento da parte visual de uma aplicação.
Para isso, o Rails possui um conceito denominado layouts. E o roteamento é para satisfazer a
URL que foi especificada.
6.1 Layouts
Na maioria das aplicações Web, as páginas variam somente no seu conteúdo principal, pos-
suindo cabeçalhos, rodapés e barras de navegação em comum. Obviamente, um framework cujo
maior objetivo é aumentar a produtividade do desenvolvedor não exigiria que o código para esses
elementos tivesse que ser repetido em cada view. Um layout funciona como um arquivo raiz,
dentro do qual o resultado de uma view é inserido automaticamente.
Mais uma vez favorecendo convenção ao invés de configuração, o Rails define um arquivo pa-
drão de layout que é usado automaticamente por qualquer view a não ser que haja especificação
em contrário. O Rail também é inteligente o bastante para somente usar um layout em views com
a mesma extensão.
O layout padrão para a aplicação fica em um arquivo chamado application.rhtml, dentro do
diretóri app/views/layouts, que não existe ainda.
Se você olhar agora o código gerado pela página que criamos até o momento, você verá o
seguinte:
46
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 6
Como você pode notar, ão estamos gerando nenhum dos elementos HTML geralmente vistos
em uma página comum.
Vamos criar o arquivo application.rhtml no diretório especificado, com o seguinte conteúdo:
ØÑÐ
Ø ØÐ Ì »Ø ØÐ
»
Ó Ý
± Ý Ð ±
» Ó Ý
» ØÑÐ
Temos no arquivo acima, o primeiro exemplo de uso de código Ruby dentro de uma view,
delimitado pelos marcadores % e %. Aqueles familiarizados com PHP e ASP reconhecerão o
estilo de marcadores, com o uso de %= objeto % para retornar conteúdo.
No caso acima, o método especial yield retorna o conteúdo atual gerado pela ação, seja por
meio de uma view ou usando render diretamente. O método yield tem uma conotação especial
47
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
no Ruby, servindo para invocar o bloco associado ao contexto. Inserido em um layout do Rails, o
bloco define a execução da ação, com seu conseqüente retorno de conteúdo.
A nossa página recarregada agora fica como mostrado abaixo:
Figura 7
Não parece muita coisa, mas, olhando o código, você verá o seguinte:
48
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 8
É fácil perceber que o código do layout foi aplicado sobre o código da view, gerando a saída
final da aplicação.
O que precisamos fazer agora é extender o nosso layout para incluir algumas amenidades. O
nosso arquivo application.rhtml poderia ser mudado para o seguinte:
ØÑÐ
Ø ØÐ Ì »Ø ØÐ
± ×ØÝÐ × Ø Ð Ò Ø ÙÐØ ±
»
Ó Ý
± Ý Ð ±
» Ó Ý
» ØÑÐ
O método stylesheet_link_tag recebe o nome de uma stylesheet como parâmetro e gera um
link para a mesma. O nosso código gerado agora ficou assim:
49
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 9
Note que mais uma vez o Rails assumiu um caminho padrão. Nesse caso, o arquivo é servido
diretamente da raiz da aplicação, que é o diretório public. Você pode criar um arquivo chamado
default.css no diretório public/stylesheets para adicioná-lo à aplicação. Um exemplo disso
seria:
Ó Ý
ß
ÓÒع Ñ ÐÝ Î Ö Ò ¸ Ö Ð¸ × Ò×¹× Ö
ÓÒØ¹× Þ ¼±
Uma coisa a manter em mente é que o layout padrão da aplicação não é, de forma alguma,
o único que pode ser gerado. Você pode criar tantos layouts quanto precisar, colocando-os no
mesmo diretório, de onde estarão acessíveis a toda aplicação.
Para usar um layout diferente em um controler você poderia fazer algo assim:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ð ÝÓÙØ ÓÑ
50
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ò Ü
Ò
Ò
O layout cujo nome é home seria especificado no arquivo app/views/layouts/home.rhtml,
com a mesma funcionalidade do arquivo application.rhtml.
Uma outra possibilidade que o Rails oference é sobrescrever um layout para uma única ação,
diretamente no método render. Um exemplo seria:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ð ÝÓÙØ ÓÑ
Ò Ü
Ò
Ò Ü ×Ô 
 Ð
Ö Ò Ö 
Ø ÓÒ Ð ×Ø ¸ Ð ÝÓÙØ ÓÑ ×Ô 
 Ð
Ò
Ò
Você pode também suprimir inteiramente um layout usando :layout = false.
Finalmente, você pode usar maneiras específicas de determinar o layout de uma página. Por
exemplo:

Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ð ÝÓÙØ 
 ÓÓ× Ð ÝÓÙØ
Ò Ü
Ò
ÔÖÓØ 
Ø

 ÓÓ× Ð ÝÓÙØ
´
ÙÖÖ ÒØ Ù× Öº Ñ Ò µ Ñ Ò ×ØÖ Ø ÓÒ ÒÓÖÑ Ð
Ò
Ò
No caso acima, dependendo do retorno da chamada ao método admin?, a aplicação poderia
usar o layout definido no arquivo administration.rhtml ou no arquivo normal.rhtml. Como podemos
ver não há muitos limites para o que pode ser feito.
6.2 Roteamento
Se você acessou a URL raiz da aplicação, você terá notado que ela não mudou, apesar do
controller que criamos. Isso acontece porque o Rails define um arquivo index.html que serve
como padrão. Se removermos esse arquivo do diretório public, ficaremos com a seguinte página:
51
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 10
Esse erro indica que o Rails não consegue encontrar um roteamento que satisfaça a URL que
especificamos. Para resolvermos o problema, vamos editar o arquivo config/routes.rb, que define
esses roteamentos. Esse arquivo contém o seguinte codigo:

Ø ÓÒ ÓÒØÖÓÐÐ Ö ÊÓÙØ Ò ÊÓÙØ ×º Ö Û Ó Ñ Ô
Ì ÔÖ ÓÖ ØÝ × × ÙÔÓÒ ÓÖ Ö Ó 
Ö Ø ÓÒ Ö×Ø 
Ö Ø ¹ ×Ø ÔÖ ÓÖ Øݺ
Ë ÑÔÐ Ó Ö ÙÐ Ö ÖÓÙØ
Ñ Ôº
ÓÒÒ 
Ø ³ÔÖÓ Ù
Ø×» ³¸ 
ÓÒØÖÓÐÐ Ö ³
 Ø ÐÓ ³¸ 
Ø ÓÒ ³Ú Û³
Ã Ô Ò Ñ Ò ÝÓÙ 
 Ò ×× Ò Ú ÐÙ × ÓØ Ö Ø Ò 
ÓÒØÖÓÐÐ Ö Ò 
Ø ÓÒ
Ë ÑÔÐ Ó Ò Ñ ÖÓÙØ
Ñ ÔºÔÙÖ
 × ³ÔÖÓ Ù
Ø×» »ÔÙÖ
 × ³¸ 
ÓÒØÖÓÐÐ Ö ³
 Ø ÐÓ ³¸ 
Ø ÓÒ ³ÔÙÖ
 × ³
Ì × ÖÓÙØ 
 Ò ÒÚÓ Û Ø ÔÙÖ
 × ÙÖд ÔÖÓ Ù
غ µ
ÓÙ 
 Ò Ú Ø ÖÓÓØ Ó ÝÓÙÖ × Ø ÖÓÙØ Ý ÓÓ Ò ÙÔ ³³
¹¹ Ù×Ø Ö Ñ Ñ Ö ØÓ Ð Ø ÔÙ Ð 
» Ò Üº ØÑк
Ñ Ôº
ÓÒÒ 
Ø ³³¸ 
ÓÒØÖÓÐÐ Ö Û Ð
ÓÑ
ÐÐÓÛ ÓÛÒÐÓ Ò Ï Ë ÖÚ 
 ÏË Ä × Ð Û Ø Ò ÜØ Ò× ÓÒ
Ò×Ø Ó Ð Ò Ñ ³Û× Ð³
Ñ Ôº
ÓÒÒ 
Ø ³ 
ÓÒØÖÓÐÐ Ö»× ÖÚ 
 ºÛ× Ð³¸ 
Ø ÓÒ ³Û× Ð³
52
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
ÁÒ×Ø ÐÐ Ø ÙÐØ ÖÓÙØ × Ø ÐÓÛ ×Ø ÔÖ ÓÖ Øݺ
Ñ Ôº
ÓÒÒ 
Ø ³ 
ÓÒØÖÓÐÐ Ö» 
Ø ÓÒ» ³
Ò
Como os comentários dizem, esse arquivo define roteamentos de URLs para controllers. Cada
roteamento é examinado quando uma URL é processada pelo Rails, da primeira para a última,
sendo a ordem de declaração a definição de prioridade.
Como você pode ver no arquivo acima, a URL padrão que mencionamos, /controller/action/id
é a última a ser definida, sendo a aplicada caso não haja instruções em contrário. O roteamento
no Rails é bem rico e trabalharemos alguns dos conceitos do mesmo mais adiante. No momento,
queremos apenas resolver o problema da página inicial.
Essa página é representada no arquivo acima pela linha abaixo, comentada no momento.
Ñ Ôº
ÓÒÒ 
Ø ³³¸ 
ÓÒØÖÓÐÐ Ö Û Ð
ÓÑ
Para mapear o controller home como nossa página inicial, basta modificar a linha para dizer o
seguinte:
Ñ Ôº
ÓÒÒ 
Ø ³³¸ 
ÓÒØÖÓÐÐ Ö ÓÑ
A rota vazia é um sinônimo para a rota raiz e estamos dizendo, com o código acima que se a
mesma for invocada, a requisição deve ser servida pelo controller que definimos anteriormente.
Note a mistura de aspas simples e aspas duplas nesse arquivo. No Ruby, elas são relativa-
mente intercambiáveis e são apenas duas das várias formas de representar texto nessa lingua-
gem. A diferença é que as aspas duplas permitem a interpolação de variáveis como veremos
mais adiante no tutorial. Eu tendo a favorecer o uso de aspas duplas, nas isso é uma opção
pessoal.
Agora, recarregando nossa página inicial temos:
53
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 11
Note que agora o mesmo controller serve dois roteamentos. Essa é apenas uma das possibi-
lidades mais simples que estão disponíveis com o roteamento do Rails.
Agora que temos um conhecimento básico de models, controllers e views, podemos combinar
o três.
54
Capítulo 7
Scaffolding e Validações
Para ajudar na rápida prototipação de aplicações, o Rails possui algo chamado de scaffolding.
E Validações, como o próprio nome indica, são um modo de garantir a integridade dos dados em
uma aplicação.
7.1 Scaffolding
O scaffolding provê uma estrutura básica para operações CRUD (Create, Retrieve, Update
and Delete), ou seja, aquelas operações básicas que temos na manipulação de dados, gerando
interfaces rápidas que podem apoiar o desenvolvimento até que você insira a codificação neces-
sária.
Para experimentar com isso e expandir um pouco nossa aplicação, vamos criar um novo
controller, que servirá para administrar os nossos contextos:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø 
ÓÒØÖÓÐÐ Ö 
ÓÒØ ÜØ×
Ü ×Ø× ÔÔ»
ÓÒØÖÓÐÐ Ö×»
Ü ×Ø× ÔÔ» ÐÔ Ö×»

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ×
Ü ×Ø× Ø ×Ø» ÙÒ
Ø ÓÒ Ð»

Ö Ø ÔÔ»
ÓÒØÖÓÐÐ Ö×»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ ÖºÖ

Ö Ø Ø ×Ø» ÙÒ
Ø ÓÒ Ð»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ Ö Ø ×غÖ

Ö Ø ÔÔ» ÐÔ Ö×»
ÓÒØ ÜØ× ÐÔ ÖºÖ
Inicialmente, esse controller é como o que criamos anteriormente, para a home da aplicação,
e não possui nenhuma ação pré-definida.
Vamos editar o seu arquivo, em app/controllers/contexts_controller.rb, acrescentando uma
linha de código:

Ð ×× ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
×
 ÓÐ 
ÓÒØ ÜØ
Ò
Agora, acesse a URL desse controller, digitando http://localhost:3000/contexts no navega-
dor que você estiver usando:
55
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 12
Sem nenhuma linha de código além da inserida acima, temos listagem, inserção, atualização
e remoção de contextos.
Clique em New context para experimentar:
56
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 13
Depois, clicando em Create, temos:
57
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 14
E, finalmente, clicando em Show, vemos:
58
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Figura 15
Note, que na tela acima, o id do objeto já aparece na URL. Nesse caso é 5 porque eu já
experimentara antes com outros objetos.
O scaffolding é muito útil na geração de controllers básicos de administração para dar apoio
à prototipação e ao início do desenvolvimento, principalmente para cadastros, permitindo que o
desenvolvedor se foque no que é mais importante para a aplicação. O inconveniente é que as
ações geradas são bem limitadas e não podem ser editadas ou traduzidas.
Para expandir um pouco a funcionalidade, existe outra forma de geração de scaffolding que
permite uma flexibilidade maior na edição das páginas geradas, que podem, inclusive, ser utiliza-
das como base para as páginas finais.
Para isso, use o comando abaixo:
ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ×
Ö ÔØ» Ò Ö Ø ×
 ÓÐ 
ÓÒØ ÜØ
Ü ×Ø× ÔÔ»
ÓÒØÖÓÐÐ Ö×»
Ü ×Ø× ÔÔ» ÐÔ Ö×»
Ü ×Ø× ÔÔ»Ú Û×»
ÓÒØ ÜØ×
Ü ×Ø× Ø ×Ø» ÙÒ
Ø ÓÒ Ð»
Ô Ò Ò
Ý ÑÓ Ð
Ü ×Ø× ÔÔ»ÑÓ Ð×»
59
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF
Ü ×Ø× Ø ×Ø»ÙÒ Ø»
Ü ×Ø× Ø ×Ø» ÜØÙÖ ×»
ÒØ 
 Ð ÔÔ»ÑÓ Ð×»
ÓÒØ ÜغÖ
ÒØ 
 Ð Ø ×Ø»ÙÒ Ø»
ÓÒØ ÜØ Ø ×غÖ
ÒØ 
 Ð Ø ×Ø» ÜØÙÖ ×»
ÓÒØ ÜØ׺ÝÑÐ

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ×» ÓÖÑºÖ ØÑÐ

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ׻Р×ØºÖ ØÑÐ

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ×»× ÓÛºÖ ØÑÐ

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ×»Ò ÛºÖ ØÑÐ

Ö Ø ÔÔ»Ú Û×»
ÓÒØ ÜØ×» ØºÖ ØÑÐ
ÓÚ ÖÛÖ Ø ÔÔ»
ÓÒØÖÓÐÐ Ö×»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ ÖºÖ Ò Õ℄ Ý
ÓÖ
 ÔÔ»
ÓÒØÖÓÐÐ Ö×»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ ÖºÖ
ÓÚ ÖÛÖ Ø Ø ×Ø» ÙÒ
Ø ÓÒ Ð»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ Ö Ø ×ØºÖ Ò Õ℄ Ý
ÓÖ
 Ø ×Ø» ÙÒ
Ø ÓÒ Ð»
ÓÒØ ÜØ× 
ÓÒØÖÓÐÐ Ö Ø ×غÖ
ÒØ 
 Ð ÔÔ» ÐÔ Ö×»
ÓÒØ ÜØ× ÐÔ ÖºÖ

Ö Ø ÔÔ»Ú Û׻РÝÓÙØ×»
ÓÒØ ÜØ×ºÖ ØÑÐ

Ö Ø ÔÙ Ð 
»×ØÝÐ × Ø×»×
 ÓÐ º
××
Note que, para a geração de um scaffold por esse comando, o nome do modelo de dados é
que deve ser passado como parâmetro, e não o nome do controller. O Rails é capaz de derivar
um do outro.
Esse comando gera a classe do modelo de dados, o controller e views para cada ação CRUD
necessária. No caso acima, como o model já existia, ele não foi criado, e foi necessário sobres-
crever alguns arquivos.
Há duas coisas a serem notadas aqui. Primeiro, o scaffold gerou o seu próprio layout, com
sua própria stylesheet. Por causa disso, o layout original da aplicação foi perdido. Uma solução
aqui será remover o arquivo app/views/layouts/contexts.rhtml, já que não precisamos dele,
e adicionar a stylesheet scaffold.css ao arquivo application.rhtml. Segundo, as views criadas
continuam razoavelmente limitadas, como veremos adiante. Abrindo o novo arquivo gerado do
controller, temos o seguinte:

Ð ×× ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö ÔÔÐ 
 Ø ÓÒ ÓÒØÖÓÐÐ Ö
Ò Ü
Ð ×Ø
Ö Ò Ö 
Ø ÓÒ ³Ð ×س
Ò
Ì× × ÓÙÐ × ´× ØØÔ »»ÛÛÛºÛ¿ºÓÖ »¾¼¼½»Ø » Ó
»Û ÒÌÓÍ× Øº ØÑе
Ú Ö Ý Ñ Ø Ó ÔÓ×ظ ÓÒÐÝ ×ØÖÓݸ 
Ö Ø ¸ ÙÔ Ø ℄¸
Ö Ö 
Ø ØÓ ß 
Ø ÓÒ Ð ×Ø
Ð ×Ø

ÓÒØ ÜØ Ô ×¸ 
ÓÒØ ÜØ× Ô Ò Ø 
ÓÒØ ÜØ׸ Ô Ö Ô ½¼
Ò
× ÓÛ

ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ
Ò
Ò Û

ÓÒØ ÜØ ÓÒØ ÜØºÒ Û
Ò
60
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF

Ö Ø

ÓÒØ ÜØ ÓÒØ ÜØºÒ Û´Ô Ö Ñ× 
ÓÒØ ÜØ℄µ

ÓÒØ ÜØº× Ú
Ð × ÒÓØ 
 ℄ ³ ÓÒØ ÜØ Û × ×Ù

 ×× ÙÐÐÝ 
Ö Ø º³
Ö Ö 
Ø ØÓ 
Ø ÓÒ ³Ð ×س
Ð×
Ö Ò Ö 
Ø ÓÒ ³Ò Û³
Ò
Ò
Ø

ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ
Ò
ÙÔ Ø

ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ

ÓÒØ ÜغÙÔ Ø ØØÖ ÙØ ×´Ô Ö Ñ× 
ÓÒØ ÜØ℄µ
Ð × ÒÓØ 
 ℄ ³ ÓÒØ ÜØ Û × ×Ù

 ×× ÙÐÐÝ ÙÔ Ø º³
Ö Ö 
Ø ØÓ 
Ø ÓÒ ³× ÓÛ³¸ 
ÓÒØ ÜØ
Ð×
Ö Ò Ö 
Ø ÓÒ ³ س
Ò
Ò
×ØÖÓÝ
ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µº ×ØÖÓÝ
Ö Ö 
Ø ØÓ 
Ø ÓÒ ³Ð ×س
Ò
Ò
O resultado final, ao ser executado, é muito parecido com o do método scaffold, com a maior
diferença sendo os arquivos de gerados enquanto que, do modo anterior, as ações eram dinami-
camente criadas pelo Rails. Algumas amenidades, como paginação, também foram introduzidas.
Uma consideração deve ser feita aqui: o scaffolding é apenas um apoio à prototipação. Ele
não deve ser usado como uma muleta, gerando páginas para modificação. Se você quer adminis-
trações prontas, existem plugins para o Rails que permitem a geração de páginas bem avançadas.
Esses plugins podem ser utilizados para criar administrações prontas a exemplo das geradas pelo
Django (o framework equivalente ao Rails para o Python), mas mesmo elas tem suas limitações
e inflexibilidades. A lição é sempre procurar o que é melhor para a sua aplicação. Os scaffoldings
são uma visão muito linear de uma aplicação e não levam em contra interfaces alternativas de
melhor usabilidade.
De qualquer forma, o scaffolding gerado é uma boa oportunidade para ver o relacionamento
entre controllers, views e models. Se você tomar uma ação qualquer como exemplo, verá que
ela usa a classe de dados para o acesso ao banco e empacota os dados recebidos em variáveis
fechadas que serão usadas por uma view, evitando que o código de apresentação se misture
com a lógica de negócio. Mesmo elementos do próprio controller, como paginação, são incluidos
nessa discriminação. Veja a view de listagem, por exemplo, descrita no arquivo list.rhtml no
diretório app/views/contexts:
½ Ä ×Ø Ò 
ÓÒØ ÜØ× » ½
Ø Ð
ØÖ
61
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails
Ruby on rails

Mais conteúdo relacionado

Mais procurados

Wx python
Wx pythonWx python
Wx python
Tiago
 
Squid guard
Squid guardSquid guard
Squid guard
Tiago
 
X dialog
X dialogX dialog
X dialog
Tiago
 
Tunelamento
TunelamentoTunelamento
Tunelamento
Tiago
 
Qemu
QemuQemu
Qemu
Tiago
 
Samba
SambaSamba
Samba
Tiago
 
Screen
ScreenScreen
Screen
Tiago
 
Manipulando pacotes
Manipulando pacotesManipulando pacotes
Manipulando pacotes
Tiago
 
Selinux
SelinuxSelinux
Selinux
Tiago
 
Xdmcp
XdmcpXdmcp
Xdmcp
Tiago
 
Drivers de Dispositivos Linux
Drivers de Dispositivos LinuxDrivers de Dispositivos Linux
Drivers de Dispositivos Linux
Hudson Augusto
 
Javascript
JavascriptJavascript
Javascript
Tiago
 
Servidor de emails_seguro
Servidor de emails_seguroServidor de emails_seguro
Servidor de emails_seguro
Tiago
 
Tcl tk
Tcl tkTcl tk
Tcl tk
Tiago
 
Horde
HordeHorde
Horde
Tiago
 
Python gtk
Python gtkPython gtk
Python gtk
Tiago
 
Jdbc
JdbcJdbc
Jdbc
Tiago
 
Java applet
Java appletJava applet
Java applet
Tiago
 

Mais procurados (20)

Wx python
Wx pythonWx python
Wx python
 
Squid guard
Squid guardSquid guard
Squid guard
 
X dialog
X dialogX dialog
X dialog
 
Tunelamento
TunelamentoTunelamento
Tunelamento
 
Qemu
QemuQemu
Qemu
 
Samba
SambaSamba
Samba
 
Screen
ScreenScreen
Screen
 
Manipulando pacotes
Manipulando pacotesManipulando pacotes
Manipulando pacotes
 
Selinux
SelinuxSelinux
Selinux
 
Xdmcp
XdmcpXdmcp
Xdmcp
 
Drivers de Dispositivos Linux
Drivers de Dispositivos LinuxDrivers de Dispositivos Linux
Drivers de Dispositivos Linux
 
Javascript
JavascriptJavascript
Javascript
 
Servidor de emails_seguro
Servidor de emails_seguroServidor de emails_seguro
Servidor de emails_seguro
 
Tcl tk
Tcl tkTcl tk
Tcl tk
 
Horde
HordeHorde
Horde
 
Python gtk
Python gtkPython gtk
Python gtk
 
Jspservlets
JspservletsJspservlets
Jspservlets
 
Jdbc
JdbcJdbc
Jdbc
 
Java Basico
Java BasicoJava Basico
Java Basico
 
Java applet
Java appletJava applet
Java applet
 

Semelhante a Ruby on rails

Linguagem ruby
Linguagem rubyLinguagem ruby
Linguagem ruby
Tiago
 
Dovecot
DovecotDovecot
Dovecot
Tiago
 
Pascal
PascalPascal
Pascal
Tiago
 
Drupal
DrupalDrupal
Drupal
Tiago
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linux
Tiago
 
Plone
PlonePlone
Plone
Tiago
 
Jspservlets
JspservletsJspservlets
Jspservlets
Tiago
 
Ltsp
LtspLtsp
Ltsp
Tiago
 
Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodle
Tiago
 
Inkscape
InkscapeInkscape
Inkscape
Tiago
 
Instalacao xoops
Instalacao xoopsInstalacao xoops
Instalacao xoops
Tiago
 
Gerenciamento de projetos
Gerenciamento de projetosGerenciamento de projetos
Gerenciamento de projetos
Tiago
 
Nessus
NessusNessus
Nessus
Tiago
 
Nagios2
Nagios2Nagios2
Nagios2
Tiago
 
Programacao gtk
Programacao gtkProgramacao gtk
Programacao gtk
Tiago
 
Java awt
Java awtJava awt
Java awt
Tiago
 
Jabber
JabberJabber
Jabber
Tiago
 
Java basico
Java basicoJava basico
Java basico
Tiago
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemas
Tiago
 
Postfix
PostfixPostfix
Postfix
Tiago
 

Semelhante a Ruby on rails (20)

Linguagem ruby
Linguagem rubyLinguagem ruby
Linguagem ruby
 
Dovecot
DovecotDovecot
Dovecot
 
Pascal
PascalPascal
Pascal
 
Drupal
DrupalDrupal
Drupal
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linux
 
Plone
PlonePlone
Plone
 
Jspservlets
JspservletsJspservlets
Jspservlets
 
Ltsp
LtspLtsp
Ltsp
 
Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodle
 
Inkscape
InkscapeInkscape
Inkscape
 
Instalacao xoops
Instalacao xoopsInstalacao xoops
Instalacao xoops
 
Gerenciamento de projetos
Gerenciamento de projetosGerenciamento de projetos
Gerenciamento de projetos
 
Nessus
NessusNessus
Nessus
 
Nagios2
Nagios2Nagios2
Nagios2
 
Programacao gtk
Programacao gtkProgramacao gtk
Programacao gtk
 
Java awt
Java awtJava awt
Java awt
 
Jabber
JabberJabber
Jabber
 
Java basico
Java basicoJava basico
Java basico
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemas
 
Postfix
PostfixPostfix
Postfix
 

Mais de Tiago

6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal
Tiago
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascal
Tiago
 
Python bge
Python bgePython bge
Python bge
Tiago
 
Curso python
Curso pythonCurso python
Curso python
Tiago
 
Curso python
Curso pythonCurso python
Curso python
Tiago
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
Tiago
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharp
Tiago
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharp
Tiago
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharp
Tiago
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharp
Tiago
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharp
Tiago
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantes
Tiago
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharp
Tiago
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivos
Tiago
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafael
Tiago
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
Tiago
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharp
Tiago
 
Classes csharp
Classes csharpClasses csharp
Classes csharp
Tiago
 
C# o basico
C#   o basicoC#   o basico
C# o basico
Tiago
 
C# classes
C#   classesC#   classes
C# classes
Tiago
 

Mais de Tiago (20)

6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascal
 
Python bge
Python bgePython bge
Python bge
 
Curso python
Curso pythonCurso python
Curso python
 
Curso python
Curso pythonCurso python
Curso python
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharp
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharp
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharp
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharp
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharp
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantes
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharp
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivos
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafael
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharp
 
Classes csharp
Classes csharpClasses csharp
Classes csharp
 
C# o basico
C#   o basicoC#   o basico
C# o basico
 
C# classes
C#   classesC#   classes
C# classes
 

Último

Química orgânica e as funções organicas.pptx
Química orgânica e as funções organicas.pptxQuímica orgânica e as funções organicas.pptx
Química orgânica e as funções organicas.pptx
KeilianeOliveira3
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
Acrópole - História & Educação
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
1000a
 
the_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdfthe_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdf
CarinaSoto12
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
kdn15710
 
A nossa mini semana 2706 2906 Juliana.pptx
A nossa mini semana 2706 2906 Juliana.pptxA nossa mini semana 2706 2906 Juliana.pptx
A nossa mini semana 2706 2906 Juliana.pptx
juserpa07
 
História Do Assaré - Prof. Francisco Leite
História Do Assaré - Prof. Francisco LeiteHistória Do Assaré - Prof. Francisco Leite
História Do Assaré - Prof. Francisco Leite
profesfrancleite
 
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdfAPOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
RenanSilva991968
 
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptxHISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
WALTERDECARVALHOBRAG
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
carlaslr1
 
Caça-palavras - ortografia S, SS, X, C e Z
Caça-palavras - ortografia  S, SS, X, C e ZCaça-palavras - ortografia  S, SS, X, C e Z
Caça-palavras - ortografia S, SS, X, C e Z
Mary Alvarenga
 
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptxINGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
AndreasCarvalho2
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
jbellas2
 
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de CarvalhoO sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
analuisasesso
 
Memorial do convento slides- português 2023
Memorial do convento slides- português 2023Memorial do convento slides- português 2023
Memorial do convento slides- português 2023
MatildeBrites
 
Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
Mary Alvarenga
 
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
Escola Municipal Jesus Cristo
 
PROPOSTA CURRICULAR EDUCACAO FISICA.docx
PROPOSTA CURRICULAR  EDUCACAO FISICA.docxPROPOSTA CURRICULAR  EDUCACAO FISICA.docx
PROPOSTA CURRICULAR EDUCACAO FISICA.docx
Escola Municipal Jesus Cristo
 
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
WelidaFreitas1
 
APOSTILA JUIZ DE PAZ capelania cristã.pdf
APOSTILA JUIZ DE PAZ capelania cristã.pdfAPOSTILA JUIZ DE PAZ capelania cristã.pdf
APOSTILA JUIZ DE PAZ capelania cristã.pdf
CarlosEduardoSola
 

Último (20)

Química orgânica e as funções organicas.pptx
Química orgânica e as funções organicas.pptxQuímica orgânica e as funções organicas.pptx
Química orgânica e as funções organicas.pptx
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
 
the_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdfthe_story_garden_5_SB_with_activities.pdf
the_story_garden_5_SB_with_activities.pdf
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
 
A nossa mini semana 2706 2906 Juliana.pptx
A nossa mini semana 2706 2906 Juliana.pptxA nossa mini semana 2706 2906 Juliana.pptx
A nossa mini semana 2706 2906 Juliana.pptx
 
História Do Assaré - Prof. Francisco Leite
História Do Assaré - Prof. Francisco LeiteHistória Do Assaré - Prof. Francisco Leite
História Do Assaré - Prof. Francisco Leite
 
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdfAPOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
APOSTILA DE TEXTOS CURTOS E INTERPRETAÇÃO.pdf
 
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptxHISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
HISTÓRIA DO CEARÁ MOVIMENTOS REVOLUCIONARIOS NO CEARÁ.pptx
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
 
Caça-palavras - ortografia S, SS, X, C e Z
Caça-palavras - ortografia  S, SS, X, C e ZCaça-palavras - ortografia  S, SS, X, C e Z
Caça-palavras - ortografia S, SS, X, C e Z
 
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptxINGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
INGLÊS COMO LÍNGUA FRANCA - IMPORTÂNCIA.pptx
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
 
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de CarvalhoO sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
O sentimento nacional brasiliero, segundo o historiador Jose Murlo de Carvalho
 
Memorial do convento slides- português 2023
Memorial do convento slides- português 2023Memorial do convento slides- português 2023
Memorial do convento slides- português 2023
 
Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
 
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
 
PROPOSTA CURRICULAR EDUCACAO FISICA.docx
PROPOSTA CURRICULAR  EDUCACAO FISICA.docxPROPOSTA CURRICULAR  EDUCACAO FISICA.docx
PROPOSTA CURRICULAR EDUCACAO FISICA.docx
 
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
 
APOSTILA JUIZ DE PAZ capelania cristã.pdf
APOSTILA JUIZ DE PAZ capelania cristã.pdfAPOSTILA JUIZ DE PAZ capelania cristã.pdf
APOSTILA JUIZ DE PAZ capelania cristã.pdf
 

Ruby on rails

  • 1. Ruby On Rails 9 de Julho de 2008
  • 2. Conteúdo I Sobre essa apostila 3 II Informações Básicas 5 III GNU Free Documentation License 10 IV Ruby on Rails 19 1 O que é o curso Ruby on Rails 20 2 Plano de ensino 21 2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3 Iniciando o Ruby on Rails 24 3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3 Configurando Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4 Gerando Migrações e Modelos de Dados 30 4.1 Gerando Migrações e Modelos de dados I . . . . . . . . . . . . . . . . . . . . . . . . 30 5 MVC e CONTROLLER 39 5.1 MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.2 O primeiro controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6 Layouts e Roteamento 43 6.1 Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.2 Roteamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1
  • 3. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF 7 Scaffolding e Validações 48 7.1 Scaffolding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 7.2 Validações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 8 Segundo Controller 56 8.1 Início . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 9 Extendendo um modelo de dados e Helpers 69 9.1 Extendendo um modelo de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 9.2 Usando Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 10 Relacionamentos 75 10.1 Início . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 11 Belongs to 81 11.1 Belongs to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 12 Has many, has one, has many through 91 12.1 Has many . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 12.2 Has one . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 12.3 Has many, trough . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 2
  • 4. Parte I Sobre essa apostila 3
  • 5. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Conteúdo O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in- ternet, disponíveis em diversos sites ou originalmente produzido no CDTC em http://www.cdtc.org.br. O formato original deste material bem como sua atualização está disponível dentro da licença GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de mesmo nome, tendo inclusive uma versão traduzida (não oficial). A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br), desde outubro de 2006. Criticas e sugestões construtivas são bem-vindas a qualquer tempo. Autores A autoria deste conteúdo, atividades e avaliações é de responsabilidade de Diego de Aquino Soares (diego@cdtc.org.br). O texto original faz parte do projeto Centro de Difusão de Tecnolgia e Conhecimento, que vem sendo realizado pelo ITI em conjunto com outros parceiros institucionais, atuando em conjunto com as universidades federais brasileiras que tem produzido e utilizado Software Livre, apoiando inclusive a comunidade Free Software junto a outras entidades no país. Informações adicionais podem ser obtidas atréves do email ouvidoria@cdtc.org.br, ou da home page da entidade, através da URL http://www.cdtc.org.br. Garantias O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi- lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido. Licença Copyright ©2006,Diego de Aquino Soares (diego@cdtc.org.br). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS- TILA. A copy of the license is included in the section entitled GNU Free Documentation License. 4
  • 7. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Sobre o CDTC Objetivo Geral O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina- ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira. Objetivo Específico Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários, criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como incentivadores e defensores de produtos de software não proprietários e código fonte aberto, ofe- recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de produtos de software não proprietários e de seu código fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro- dutos de software livre. Guia do aluno Neste guia, você terá reunidas uma série de informações importantes para que você comece seu curso. São elas: • Licenças para cópia de material disponível • Os 10 mandamentos do aluno de Educação a Distância • Como participar dos fóruns e da wikipédia • Primeiros passos É muito importante que você entre em contato com TODAS estas informações, seguindo o roteiro acima. Licença Copyright ©2006, Diego de Aquino Soares (diego@cdtc.org.br). 6
  • 8. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Software Foundation; com o Capítulo Invariante SOBRE ESSA APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu- mentação Livre GNU". Os 10 mandamentos do aluno de educação online • 1. Acesso a Internet: ter endereço eletrônico, um provedor e um equipamento adequado é pré-requisito para a participação nos cursos a distância. • 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá- tica é necessário para poder executar as tarefas. • 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân- cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores. • 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e fazendo ser respeitado pelo mesmo. • 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão e a sua recuperação de materiais. • 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e realizá-las em tempo real. • 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre. • 8. Flexibilidade e adaptação: requisitos necessário a mudança tecnológica, aprendizagens e descobertas. • 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é ponto-chave na comunicação pela Internet. • 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração. Como participar dos fóruns e Wikipédia Você tem um problema e precisa de ajuda? Podemos te ajudar de 2 formas: A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso: O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a 7
  • 9. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que interesse ao grupo, favor postá-la aqui. Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do curso, é recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais efetivos para esta prática. . O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem ajudar. Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico é recomendável ver se a sua pergunta já foi feita por outro participante. A segunda forma se dá pelas Wikis: Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par- ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé- dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em português pelos links: • Página principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo! Primeiros Passos Para uma melhor aprendizagem é recomendável que você siga os seguintes passos: • Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar; • Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas básicas do mesmo; • Entrar nas lições seguindo a seqüência descrita no Plano de Ensino; • Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais. Perfil do Tutor Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 8
  • 10. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor ou instrutor: • fornece explicações claras acerca do que ele espera, e do estilo de classificação que irá utilizar; • gosta que lhe façam perguntas adicionais; • identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por- que motivo a classificação foi ou não foi atribuída’; • tece comentários completos e construtivos, mas de forma agradável (em contraste com um reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de ameaça e de nervosismo’) • dá uma ajuda complementar para encorajar um estudante em dificuldade; • esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente; • ajuda o estudante a alcançar os seus objetivos; • é flexível quando necessário; • mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); • escreve todas as correções de forma legível e com um nível de pormenorização adequado; • acima de tudo, devolve os trabalhos rapidamente; 9
  • 11. Parte III GNU Free Documentation License 10
  • 12. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF (Traduzido pelo João S. O. Bueno através do CIPSGA em 2001) Esta é uma tradução não oficial da Licençaa de Documentação Livre GNU em Português Brasileiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a dis- tribuição de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso. Entretanto, nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL. This is an unofficial translation of the GNU General Documentation License into Brazilian Por- tuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GFDL–only the original English text of the GFDL does that. However, we hope that this translation will help Portuguese speakers understand the GFDL better. Licença de Documentação Livre GNU Versão 1.1, Março de 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas não é permitido alterá-lo. INTRODUÇÃO O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo, com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável pelas modificações feitas por terceiros. Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge- ral (GNU GPL), que é um copyleft para software livre. Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin- cipalmente para trabalhos cujo propósito seja de introdução ou referência. APLICABILIDADE E DEFINIÇÕES Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença. 11
  • 13. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um licenciado e é referida como "você". Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra língua. Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex- clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a Seção Secundária pode não explicar nada de matemática). Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci- onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo. As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença. Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença. Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica- mente, representada num formato cuja especificação esteja disponível ao público geral, cujos conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou (para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de servir como entrada a formatadores de texto ou para tradução automática para uma variedade de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de- sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é "Transparente"é chamada de "Opaca". Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim- ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietários que podem ser lidos e editados apenas com processadores de texto proprietários, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com finalidade apenas de saída. A "Página do Título"significa, para um livro impresso, a página do título propriamente dita, mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível, o material que esta Licença requer que apareça na página do título. Para trabalhos que não tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe- minente do título do trabalho, precedendo o início do corpo do texto. 12
  • 14. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF FAZENDO CÓPIAS EXATAS Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres- cente nenhuma outra condição, quaisquer que sejam, às desta Licença. Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com- pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias, você também precisa respeitar as condições da seção 3. Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também pode exibir cópias publicamente. FAZENDO CÓPIAS EM QUANTIDADE Se você publicar cópias do Documento em número maior que 100, e a nota de licença do Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o titulo com- pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia exata em outros aspectos. Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa verdadeira, e continuar os outros nas páginas adjacentes. Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente completa do Documento acessível publicamente em uma rede de computadores, a qual o público usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel- mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar que esta cópia Transparente vai permanecer acessível desta forma na localização especificada por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta- mente ou através de seus agentes ou distribuidores) daquela edição para o público. É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você com uma versão atualizada do Documento. 13
  • 15. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF MODIFICAÇÕES Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se- ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença, com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além disso, você precisa fazer o seguinte na versão modificada: A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do- cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se o editor original daquela versão lhe der permissão; B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá- veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que cinco); C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor; D. Preservar todas as notas de copyright do Documento; E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às outras notas de copyright; F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico abaixo; G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de Capa requeridos dados na nota de licença do Documento; H. Incluir uma cópia inalterada desta Licença; I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar um item descrevendo a Versão Modificada, tal como descrito na sentença anterior; J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu- mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção "Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira der sua permissão; K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da 14
  • 16. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri- buidores e/ou dedicatórias dados; L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção; M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão Modificada; N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro título dado a uma Seção Invariante. Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci- sam ser diferentes de qualquer outro título de seção. Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual- quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a definição oficial de um padrão. Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente , e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que adicionou a passagem antiga. O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer Versão Modificada. COMBINANDO DOCUMENTOS Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com- binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença. O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de 15
  • 17. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado. Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver- sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as seções entituladas como "Endosso". COLETÂNEAS DE DOCUMENTOS Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia exata de cada um dos Documentos em todos os outros aspectos. Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta Licença em todos os outros aspectos relacionados à cópia exata daquele documento. AGREGAÇÃO COM TRABALHOS INDEPENDENTES Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se- parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver- são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim compilados, e eles não são trabalhos derivados do Documento. Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento, então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado. Senão eles precisarão aparecer nas capas de todo o agregado. TRADUÇÃO Tradução é considerada como um tipo de modificação, então você pode distribuir traduções do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in- clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a 16
  • 18. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF versão original em Inglês desta Licença, a versão original em Inglês prevalecerá. TÉRMINO Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres- samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen- ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total acordo com esta Licença. REVISÕES FUTURAS DESTA LICENÇA A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen- tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja http://www.gnu.org/copyleft/. A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o Documento não especificar um número de Versão desta Licença, você pode escolher qualquer versão já publicada (não como rascunho) pela Free Software Foundation. ADENDO: Como usar esta Licença para seus documentos Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença no documento e ponha as seguintes notas de copyright e licenças logo após a página de título: Copyright (c) ANO SEU NOME. É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft- ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li- cença está inclusa na seção entitulada "Licença de Documentação Livre GNU". Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os Textos da Quarta Capa. Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda- mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre, 17
  • 19. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF tal como a GNU General Public License, para permitir o seu uso em software livre. 18
  • 20. Parte IV Ruby on Rails 19
  • 21. Capítulo 1 O que é o curso Ruby on Rails Ruby on Rails, ou simplismente Rails, é um framework para aplicações web desenvolvido todo na linguagem de programação Ruby. Para vocês, que estão fazendo esse curso, devem está familiarizados com essa linguagem de programação. Rails é uma ferramenta muito poderosa na hora de fazer aplicações web, como vocês poderão ver ao longo do curso. 20
  • 22. Capítulo 2 Plano de ensino 2.1 Objetivo Qualificar técnicos e programadores no framework Ruby on Rails 2.2 Público Alvo Técnicos e Programadores que desejam trabalhar com Ruby on Rails. 2.3 Pré-requisitos Os usuários deverão ser, necessariamente, indicados por empresas públicas e ter conheci- mento básico acerca da lógica de programação, HTML, Linguagem Ruby, MySQL e CSS. 2.4 Descrição O curso de Ruby on Rails será realizado na modalidade EAD e utilizará a plataforma Moodle como ferramenta de aprendizagem. Ele é composto de um módulo de aprendizado que será dado na primeira semana e um módulo de avaliação que será dado na segunda semana. O material didático estará disponível on-line de acordo com as datas pré-estabelecidas no calendário. A versão utilizada para o Ruby on Rails será a 1.1. 2.5 Metodologia O curso está dividido da seguinte maneira: 2.6 Cronograma • Lição 1 - Iniciando o Ruby on Rails; • Lição 2 - Gerando migrações e modelos de dados; 21
  • 23. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF • Lição 3 - MVC e CONTROLLER; • Lição 4 - Layouts e Roteamento; • Lição 5 - Scaffolding e Validações; • Lição 6 - Segundo controller; • Lição 7 - Extendendo um modelo de dados e Helpers. • Lição 8 - Relacionamentos; • Lição 9 - Belongs to • Lição 10 - has many, has one, e has many, through As lições contém o contéudo principal. Elas poderão ser acessadas quantas vezes forem neces- sárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada lição, pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição for menor do que 6.0, sugerimos que você faça novamente esta lição. Ao final do curso será disponibilizada a avaliação referente ao curso. Tanto as notas das lições quanto a da avaliação serão consideradas para a nota final. Todos os módulos ficarão visíveis para que possam ser consultados durante a avaliação final. Aconselhamos a leitura da "Ambientação do Moodle"para que você conheça a plataforma de Ensino a Distância, evitando dificuldades advindas do "desconhecimento"sobre a mesma. Os instrutores estarão a sua disposição ao longo de todo curso. Qualquer dúvida deverá ser enviada no fórum. Diariamente os monitores darão respostas e esclarecimentos. 2.7 Programa O curso Ruby on Rails oferecerá o seguinte conteúdo: • Iniciando o Ruby on Rails; • Gerando migrações e modelos de dados; • MVC e CONTROLLER; • Layouts e Roteamento; • Scaffolding e Validações; • Segundo controller; • Extendendo um modelo de dados e Helpers. • Relacionamentos; • Belongs to • has many, has one, e has many, through 22
  • 24. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF 2.8 Avaliação Toda a avaliação será feita on-line. Aspectos a serem considerados na avaliação: • Iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento; • Capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados. Instrumentos de avaliação: • Participação ativa nas atividades programadas. • Avaliação ao final do curso. • O participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo com a fórmula abaixo: • Nota Final = ((ML x 7) + (AF x 3)) / 10 = Média aritmética das lições • AF = Avaliações 2.9 Bibliografia • Site oficial: http://www.rubyonrails.org; • Rails para sua diversão e lucro. • http://forum.rubyonbr.org/forums/4/topics/2503 23
  • 25. Capítulo 3 Iniciando o Ruby on Rails Essa lição tem uma parte introdutória ao Rails e a instalação do mesmo. 3.1 Introdução Ruby on Rails é um poderoso Framework para aplicações web. O curso é voltado para desen- volvedores já familiarizados com algum ambiente de desenvolvimento Web, seja usando Linux ou Windows. Por razões de tempo, o curso assume que o desenvolvedor já tenha conhecimento de pelo menos uma linguagem de programação, de um banco de dados relacional qualquer e que seja capaz de estabelecer um ambiente para essa linguagem e banco de dados em sua plata- forma de escolha, ou seja, que tenha o conhecimento técnico para acompanhar os passos dados no curso sem maiores problemas. O curso não assume, porém, que o desenvolvedor saiba fazer o mesmo para o Rails e explica isso nos detalhes necessários. Um certo conhecimento do Ruby é requerido, embora a linguagem seja simples e poderosa o suficiente para ser inteligível para qualquer desenvolvedor com uma experiência razoável em outra linguagem de alto nível. Apesar disso, esse tutorial pode não ser tão fácil para desenvolve- dores que estejam dando os seus primeiros passos em programação e em especial programação para a Web?embora eu acredite que desenvolvedores iniciantes possam se beneficiar muito com o contato com uma linguagem mais poderosa e com um framework mais elaborado. Foi usado nesse curso o MySQL na elaboração do tutorial por ele ser um banco de fácil insta- lação, mas você pode usar o que mais se adaptar ao seu ambiente, principalmente, considerando que o Rails esconde a maior parte da complexidade nessa área e que ele suporta os principais bancos de dados existentes no mercado. Para começar, vamos assumir que você tenha um banco de dados instalado e que esteja pronto para instalar o Rails e quaisquer outras bibliotecas necessárias. Como é bom que você já tenha se familiarizado com a linguagem Ruby (seria útil que você já tenha feito o nosso curso Linguagem Ruby), a de se supor que você já tenha instalado em sua máquina o Ruby. O Ruby é uma linguagem de alto nível, tão completa quanto uma linguagem poderia ser. Sua sintaxe é bem simples, e lembra Ada e Eiffel, com algumas pitadas de Perl em alguns pontos. 3.2 Instalação Para verificar a versão instalada do Ruby, use o seguinte comando: 24
  • 26. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF ronaldo@minerva: $ ruby -v ruby 1.8.4 (2005-12-24) [i486-linux] Uma vez que o Ruby esteja instalado, é hora de fazer o mesmo com o Rails. O procedimento é bem simples: Como usuário root digite: apt-get install rails Simples assim. Novas versões do Rails são instalados por um processo similar. Se você já baixou alguma versão alguma vez, use o mesmo comando acima para atualizar a sua distribuição para a versão mais recente, lembrando, principalmente, de que a versão 1.1.6 corrige um sério problema de segurança nas versões anteriores e deve ser a única usada em um servidor público. Com os passos acima finalizados e um banco de dados disponível, você está pronto para começar o desenvolvimento em Rails. A primeira coisa a fazer, então, é criar o diretório de trabalho da aplicação. Isso é feito com o comando abaixo: ronaldo@minerva: /tmp$ rails gtd create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create components create db create doc create lib create lib/tasks create log create public/images create public/javascripts create public/stylesheets create script/performance create script/process create test/fixtures create test/functional create test/integration create test/mocks/development create test/mocks/test create test/unit create vendor create vendor/plugins ... O comando rails gera o esqueleto completo de uma aplicação, pronta para rodar. Esse co- mando foi criado em seu sistema quando você instalou as bibliotecas necessárias. No esqueleto gerado, cada parte da aplicação tem um local específico para ser colocado. Isso deriva de uma das filosofias por trás do Rails que pode ser descrita pela frase ?convenção ao invés de configuração?. Convenção, nesse caso, significa que há um acordo entre o framework e você, o desenvolvedor, de modo que você não precisa de preocupar com certos detalhes que, de outra forma, teriam que se descritos em um arquivo de configuração. 25
  • 27. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF No Rails, basta executar uma determinada ação ou criar um determinado arquivo e as coi- sas funcionarão da maneira que você deseja e espera automaticamente, sem necessidade de qualquer trabalho adicional. A princípio isso pode parecer um pouco restritivo, mas na prática funciona perfeitamente. E sendo extremamente flexível, o Rails permite que você mude qualquer coisa que precise, quando precisar. Agora que temos uma aplicação básica, vamos rodá-la e ver o resultado. Uma das vantagens do Rails é que o ciclo de codificar-rodar-e-testar é bem rápido. Basta fazer uma alteração para ver imediatamente o resultado, sem a necessidade de recarregar processos, esperar a compilação da aplicação ou enviá-la para um servidor especialmente preparado. O máximo que você terá que fazer no Rails é reiniciar o servidor Web no caso de alguma mudança fundamental na configuração básica da aplicação, algo que ocorre com pouca freqüência. Para facilitar a vida, o Rails vem com seu próprio servidor Web, utilizando as bibliotecas do próprio Ruby. Para rodar o servidor, basta usar um dos scripts utilitários presentes em cada aplicação gerada pelo Rails (veja o diretório script sob o esqueleto da aplicação). O comando, executado dentro do diretório da aplicação, é o seguinte: ronaldo@minerva: /tmp/gtd$ script/server => Booting WEBrick... => Rails application started on http://0.0.0.0:3000 style="text-align: justify; font-family: courier new,courier,monospace; font-weight: bold;»=> Ctrl-C to shutdown server; call with –help for options [2006-09-20 10:31:40] INFO WEBrick 1.3.1 [2006-09-20 10:31:40] INFO ruby 1.8.4 (2005-12-24) [i486-linux] [2006-09-20 10:31:40] INFO WEBrick::HTTPServer#start: pid=8262 port=3000 Como você poder ver, o comando inicia uma instância do servidor WEBrick, capaz de servir aplicações Rails sem necessidade de qualquer configuração adicional. O servidor roda local- mente e recebe requisições na porta 3000. Sendo um servidor simples e embutido, o WEBrick não é capaz de receber requisições simultâneas, mas permite que testemos perfeitamente a nossa aplicação. Acessando o ende- reço da aplicação você tem o seguinte: 26
  • 28. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 1 Como mostrado acima, temos uma aplicação inicial rodando que, inclusive, mostra quais são os próximos passos para continuar o desenvolvimento da mesma. 3.3 Configurando Banco de Dados Vamos acatar a sugestão da página inicial e criar e configurar o banco de dados da aplica- ção. Esse primeiro passo é muito importante porque o Rails usa as informações proveniente do schema do banco de dados para gerar automaticamente arquivos e configurações adicionais. Esse é mais um exemplo de convenção ao invés de configuração. Dessa forma, garantir que o banco está funcionando corretamente, configurado para uso da aplicação, é o passo inicial de qualquer desenvolvimento em Rails. O arquivo de configuração de banco de dados se chamada database.yml e está localizado no diretório config, junto com os demais arquivos de configuração da aplicação. Esse arquivo, removendo os comentários (as linhas iniciadas com #), tem o seguinte formato Ú ÐÓÔÑ ÒØ ÔØ Ö ÑÝ×ÕÐ 27
  • 29. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ø × Ø Ú ÐÓÔÑ ÒØ Ù× ÖÒ Ñ ÖÓÓØ Ô ××ÛÓÖ Ó×Ø ÐÓ Ð Ó×Ø Ø ×Ø ÔØ Ö ÑÝ×ÕÐ Ø × Ø Ø ×Ø Ù× ÖÒ Ñ ÖÓÓØ Ô ××ÛÓÖ Ó×Ø ÐÓ Ð Ó×Ø ÔÖÓ Ù Ø ÓÒ ÔØ Ö ÑÝ×ÕÐ Ø × Ø ÔÖÓ Ù Ø ÓÒ Ù× ÖÒ Ñ ÖÓÓØ Ô ××ÛÓÖ Ó×Ø ÐÓ Ð Ó×Ø A extensao .yml se refere ao formato do arquivo, que utiliza uma linguagem de domínio cha- mada YAML. Por hora, basta saber que é uma linguagem de serialização de dados favorecida por desenvolvedores Ruby e Rails. Uma aplicação Rails geralmente utiliza três bancos de dados, como demonstrado acima, um para cada ambiente de desenvolvimento padrão. Um banco de dados é utilizado para o desen- volvimento, onde todas as mudanças são aplicadas. Esse banco tem seu correspondente em um banco de produção, onde modificações somente são aplicadas uma vez que estejam comple- tas. O arquivo permite configurar, inclusive, um banco remoto para onde suas modificações finais serão redirecionadas?embora geralmente seja melhor utilizar um outro método de implantação, como veremos mais adiante. O terceiro banco mostrado acima é um banco de testes, utilizado pelo Rails para a execução de unit testing. Esse banco deve ser mantido necessariamente à parte já que todos os dados e tabelas presentes no mesmo são excluídos e recriados a cada teste completo efetuado na aplicação. Vamos criar o banco agora: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô ÒØ Ö Ô ××ÛÓÖ Ï Ð ÓÑ ØÓ Ø ÅÝËÉÄ ÑÓÒ ØÓÖº ÓÑÑ Ò × Ò Û Ø ÓÖ º ÓÙÖ ÅÝËÉÄ ÓÒÒ Ø ÓÒ × ØÓ × ÖÚ Ö Ú Ö× ÓÒ º¼º¾¾¹ Ò ¼Ù ÙÒØÙ º¼ º¾¹ÐÓ ÌÝÔ ³ ÐÔ ³ ÓÖ ³ ³ ÓÖ ÐÔº ÌÝÔ ³ ³ ØÓ Ð Ö Ø Ù Öº ÑÝ×ÕÐ Ö Ø Ø × Ø ÉÙ ÖÝ Çø ½ ÖÓÛ Ø ´¼º × µ ÑÝ×ÕÐ Ö Ø Ø × Ø Ø ×Ø ÉÙ ÖÝ Çø ½ ÖÓÛ Ø ´¼º ¿ × µ ÑÝ×ÕÐ Ù× Ø Ø × Ò ÑÝ×ÕÐ Modificando o arquivo de configuração para desenvolvimento local (database.yml), teríamos algo assim: 28
  • 30. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ú ÐÓÔÑ ÒØ ÔØ Ö ÑÝ×ÕÐ Ø × Ø Ù× ÖÒ Ñ ÖÓÓØ Ô ××ÛÓÖ Ó×Ø ÐÓ Ð Ó×Ø ×Ó Ø »Ú Ö»ÖÙÒ»ÑÝ×ÕÐ »ÑÝ×ÕÐ º×Ó Ø ×Ø ÔØ Ö ÑÝ×ÕÐ Ø × Ø Ø ×Ø Ù× ÖÒ Ñ ÖÓÓØ Ô ××ÛÓÖ Ó×Ø ÐÓ Ð Ó×Ø ×Ó Ø »Ú Ö»ÖÙÒ»ÑÝ×ÕÐ »ÑÝ×ÕÐ º×Ó ÔÖÓ Ù Ø ÓÒ Ú ÐÓÔÑ ÒØ No caso acima, eu configurei os banco de produção e desenvolvimento para apontarem para o mesmo local já que o desenvolvimento está limitado à minha máquina. Essa é uma estratégia interessante a usar quando queremos testar uma aplicação nas duas situações localmente sem nos preocuparmos em copiar o banco a todo momento?mesmo que o Rails permita isso com pouco mais do que alguns comandos. Eu precisei também acrescentar o método de transporte socket à configuração já que em minha máquina, especificamente, o MySQL não permite cone- xões de rede em sua configuração padrão. Outros tipos bancos de dados são configurados de maneira similar, mudando o parâmetro adapter e quaisquer outras configurações necessárias. Uma maneira mais simples de gerar uma arquivo de configuração específico para o banco de da- dos que você está usando é já invocar o comando para gerar o esqueleto da aplicação passando um parâmetro para isso. Por exemplo: rails –database=oracle gtd O comando acima gera o mesmo esqueleto da aplicação, com a única diferença de que o arquivo database.yml será um pouco diferente para levar em conta as diferenças do Oracle. Vol- tando à nossa aplicação, como um arquivo de configuração importante foi mudado, o servidor Web precisa ser reiniciado. Isso acontece porque ele somente lê essas configurações no início de execução. Esse é um dos raros casos em que um servidor de desenvolvimento precisa ser reiniciado já que o Rails recarrega praticamente qualquer modificação feita na aplicação quando está no modo de desenvolvimento. Agora temos uma aplicação e um banco de dados configurado. Com isso já podemos iniciar o processo de desenvolvimento propriamente dito. Para acesso ao banco de dados, o Rails usa classes de dados conhecidas como models, ou modelos de dados. Essas classes mascaram os detalhes ¨sórdidos¨do acesso ao banco de dados providenciando uma interface fácil e intuitiva ao desenvolvedor. Em qualquer aplicação, teremos pelo menos um modelo de dados para utilizar na mesma. E a maneira mais fácil de fazer isso é criar automaticamente a tabela no banco de dados, utilizando um dos scripts do Rails. O Rails automaticamente entende que todas as tabelas criadas no banco para uso em mode- los, ou classes de dados, satisfarão a duas condições: terão um nome plural em inglês e terão 29
  • 31. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF uma chave primária surrogada inteira e auto-incrementada chamada id. É possível mudar ambas as condições, mas inicialmente ficaremos com elas para não ter que modificar o que o Rails gera e usa automaticamente. Para facilitar o desenvolvimento, a aplicação desenvolvida está em inglês, que espero seja simples o suficiente mesmo para a compreensão do leitor que não domine plenamente este idi- oma. Considerando a profusão de termos em inglês em nossa área acho que isso não será um problema. O uso do inglês evita que tenhamos que pensar em alguns detalhes de tradução e globalização enquanto estamos aprendendo o Rails. Mais no fim do tutorial explicaremos como mudar algumas das coisas que o Rails por como padrão. 30
  • 32. Capítulo 4 Gerando Migrações e Modelos de Dados Essa lição tem como objetivo mostrar como alterar qualquer natureza no banco de dados. 4.1 Gerando Migrações e Modelos de dados I Para manter portabilidade e facilitar o controle de versionamento do banco de dados, o Rails utiliza algo chamado migrations (migrações). São scripts em Ruby descrevendo modificações de qualquer natureza no banco de dados. Migrações são a maneira mais fácil de acrescentar tabelas e classes de dados ao Rails e é o que utilizaremos agora. A primeira tabela que vamos criar será a tabela de contextos. Contextos, no GTD, são, basicamente, os ambientes onde uma ação será executada, como, por exemplo, casa, escritório, e-mail, telefone, etc. Vamos gerar então uma migração para essa primeira modificação no banco: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø Ñ Ö Ø ÓÒ Ö Ø ÓÒØ ÜØ× Ö Ø »Ñ Ö Ø Ö Ø »Ñ Ö Ø »¼¼½ Ö Ø ÓÒØ ÜØ×ºÖ O script generate é uma das ferramentas cruciais do Rails que utilizaremos ao longo de todo nosso curso, sendo usado, como o nome indica, para criar basicamente qualquer estrutura que precisamos em uma aplicação. O seu primeiro parâmetro é o tipo de objeto que estamos ge- rando, seu segundo parâmetro é o nome desse objeto e quaisquer outros parâmetro adicionais indicam opções de geração. No caso acima, estamos gerando uma migração, cujo nome é cre- ate_contexts. No Rails, existem muitas convenções quanto ao uso de nomes, que são seguidas pelos comandos do mesmo, com conversões automáticas quando necessário. No caso acima, por exemplo, o nome que usamos será automaticamente convertido em um nome de classe, que no Ruby são expressas com capitalização alternada, como você poderá ver abaixo. O resultado do comando é um arquivo novo, prefixado pela versão da migração, que foi criado no diretório db/migrate. Esse prefixo é usado para controlar quais alterações um banco precisa sofrer para chegar a uma versão específica. Editando o arquivo, temos o seguinte: Ð ×× Ö Ø ÓÒØ ÜØ× Ø Ú Ê ÓÖ Å Ö Ø ÓÒ × Ð ºÙÔ 31
  • 33. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ò × Ð º ÓÛÒ Ò Ò O Rails criou uma classe derivada () da classe ActiveRecord::Migration com dois métodos. Esses métodos, por estarem prefixados por self, indicam no Ruby que os mesmos podem ser chamados diretamente na classe (métodos estáticos na terminologia do C++, C# e do Java), sem necessidade de uma instância. O método self.up é utilizado para efetuar as modificações. O seu oposto, self.down, é usado para desfazer essas modificações caso você esteja revertendo para uma versão anterior do banco. Dependendo da forma como os métodos forem escritos, eles serão realmente complementares. Obviamente é possível que modificações sejam efetuadas que não são reversíveis. Nesse caso, o Rails emitirá um erro se uma migração para uma versão mais baixa for tentada. Vamos editar o arquivo agora para incluir a tabela que desejamos criar: Ð ×× Ö Ø ÓÒØ ÜØ× Ø Ú Ê ÓÖ Å Ö Ø ÓÒ × Ð ºÙÔ Ö Ø Ø Ð ÓÒØ ÜØ× Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Ò Ò × Ð º ÓÛÒ ÖÓÔ Ø Ð ÓÒØ ÜØ× Ò Ò Para efetuar suas migrações, o Rails utiliza uma linguagem de domínio que permite especificar operações de banco de dados de forma abstrata, que não está presa a um servidor específico. É possível executar operações diretamente via SQL no banco, mas isso não é recomendado por quebrar essa abstração. No caso acima, o método create_table dentro de self.up serve para especificar a tabela que será criada. Esse método recebe um bloco como parâmetro (indicado pela palavra-chave do) que especifica as colunas que serão adicionadas. Blocos são uma das partes mais interessantes do Ruby e vale a estudar um pouco o que eles podem fazer já que o uso dos mesmos é extenso em qualquer aplicação na linguagem, incluindo o Rails. No Ruby, os blocos são valores de primeira classe, que pode ser atribuídos e manipulados como qualquer outro objeto. Um outro detalhe a manter em mente é o uso extensivo de símbolos no Ruby. No caso acima, o próprio nome da tabela é denotado por um símbolo. Símbolos são similares a strings, com a diferença fundamental que são internalizados e existem com uma única instância que permite um uso transparente e eficiente dos mesmos. Voltando ao nosso código, como a tabela terá somente uma coluna inicialmente, que é o nome do contexto, somente precisamos de uma linha, identificando o nome da coluna e seu tipo. Mais à frente veremos outros tipos e opções. O método self.down, como explicando, realiza a operação inversa destruindo a tabela. Agora é hora de aplicar essa migração ao banco, subindo sua versão. Para isso, temos o utilitário rake, que é parte do Ruby. O rake é o equivalente Ruby do make, sendo capaz de realizar tarefas descritas em um Rakefile, da mesma forma que o make faz uso de um Makefile. O Rails 32
  • 34. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF vem com seu próprio Rakefile que permite a execução de várias de suas tarefas necessárias, incluindo db:migrate, que aplica as migrações ainda não efetuadas a um banco. Rodamos o comando da seguinte forma: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° Ö Ñ Ö Ø ´ Ò »ØÑÔ» Ø µ Ö Ø ÓÒØ ÜØ× Ñ Ö Ø Ò ¹¹ Ö Ø Ø Ð ´ ÓÒØ ÜØ×µ ¹ ½º¾¼ × Ö Ø ÓÒØ ÜØ× Ñ Ö Ø ´½º¾¼ ¾×µ Se observamos o banco agora, teremos o seguinte schema: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø ÑÝ×ÕÐ × ÓÛ Ø Ð × ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· Ì Ð × Ò Ø ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ÓÒØ ÜØ× × Ñ Ò Ó ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ¾ ÖÓÛ× Ò × Ø ´¼º¼¼ × µ Duas tabelas foram criadas, contexts e schema_info. A primeira é a que especificamos. A segunda descreve informações do banco para o Rails, para controlar o versionamento do mesmo. A tabela contexts ficou assim: Ó ÒÚÑ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô ÑÝ×ÕÐ × Ö ÓÒØ ÜØ× ·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· Ð ÌÝÔ ÆÙÐÐ Ã Ý ÙÐØ ÜØÖ ·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ÒØ´½½µ ÆÇ ÈÊÁ ÆÍÄÄ ÙØÓ Ò Ö Ñ ÒØ Ò Ñ Ú Ö Ö´¾ µ Ë ÆÍÄÄ ·¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ¾ ÖÓÛ× Ò × Ø ´¼º¼¼ × µ Como você pode ver, não é preciso especificar a chave primária surrogada, que é automati- camente criada pelo Rails. A tabela schema_info possui os seguintes dados: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø ÑÝ×ÕÐ × Ð Ø ¶ ÖÓÑ × Ñ Ò Ó ·¹¹¹¹¹¹¹¹¹· Ú Ö× ÓÒ ·¹¹¹¹¹¹¹¹¹· ½ ·¹¹¹¹¹¹¹¹¹· ½ ÖÓÛ Ò × Ø ´¼º¼¼ × µ 33
  • 35. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Esse número de versão será incrementado ou decrementado dependendo da direção da mi- gração. A migração também criou o arquivo db/schema.rb, contendo uma representação do banco em Ruby, que pode ser usada para recriar a estrutura do mesmo em qualquer banco suportado pelo Rails, usando uma outra tarefa do rake. O arquivo é auto-gerado e não deve ser modificado manualmente. Seu formato pode ser visto abaixo: Ì × Ð × ÙØÓ Ò Ö Ø º ÁÒ×Ø Ó Ø Ò Ø × Ð ¸ ÔÐ × Ù× Ø Ñ Ö Ø ÓÒ× ØÙÖ Ó Ø Ú Ê ÓÖ ØÓ Ò Ö Ñ ÒØ ÐÐÝ ÑÓ Ý ÝÓÙÖ Ø × ¸ Ò Ø Ò Ö Ò Ö Ø Ø × × Ñ Ò Ø ÓÒº Ø Ú Ê ÓÖ Ë Ñ º Ò ´ Ú Ö× ÓÒ ½µ Ó Ö Ø Ø Ð ÓÒØ ÜØ× ¸ ÓÖ ØÖÙ Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Ò Ò Note apenas que essa representação é limitada às tabelas em si e não inclui chaves es- trangeiras, triggers ou stored procedures. O próximo passo agora é criar a classe de dados correspondente à tabela. Para isso, usamos o comando abaixo: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø ÑÓ Ð ÓÒØ ÜØ Ü ×Ø× ÔÔ»ÑÓ Ð×» Ü ×Ø× Ø ×Ø»ÙÒ Ø» Ü ×Ø× Ø ×Ø» ÜØÙÖ ×» Ö Ø ÔÔ»ÑÓ Ð×» ÓÒØ ÜØºÖ Ö Ø Ø ×Ø»ÙÒ Ø» ÓÒØ ÜØ Ø ×ØºÖ Ö Ø Ø ×Ø» ÜØÙÖ ×» ÓÒØ ÜØ׺ÝÑÐ Ü ×Ø× »Ñ Ö Ø ÒÓØ Ö Ñ Ö Ø ÓÒ × ÐÖ Ý Ò Ñ Ö Ø ÓÒØ ÜØ× »Ñ Ö Ø »¼¼½ Ö Ø ÓÒØ ÜØ×ºÖ O Rails utiliza uma estratégia de desenvolvimento (conhecidas como patterns de maneira geral) chamada de MVC (Model-View-Controller). Essa estratégia separa os componentes da aplicação em partes distintas que não só facilitam o desenvolvimento como também facilitam a manutenção. O que estamos vendo no momento são os models, que correspondem à camada de acesso ao banco de dados, implementada no Rails por um componente denominado ActiveRe- cord. O comando acima gera toda estrutura de suporte ao modelo, incluindo testes e migrações para o mesmo. Como geramos a nossa migração inicial manualmente, o Rails nos informa que já existe uma com o mesmo nome que ele pretendia gerar e que ele está pulando esse passo. O arquivo responsável pela implementação do modelo está em app/model/context.rb e contém apenas o seguinte: Ð ×× ÓÒØ ÜØ Ø Ú Ê ÓÖ × Ò Essas duas linhas, apoiadas pelo Rails, já providenciam uma riqueza de implementação que nos permite recuperar, inserir e atualizar dados no banco, e executar uma série de outras opera- ções complexas sem a necessidade de qualquer comando SQL direto. Vamos criar agora um novo modelo correspondendo à tabela de projetos. Vamos deixar que o Rails gere a migração dessa vez. O comando é: 34
  • 36. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø ÑÓ Ð ÔÖÓ Ø Ü ×Ø× ÔÔ»ÑÓ Ð×» Ü ×Ø× Ø ×Ø»ÙÒ Ø» Ü ×Ø× Ø ×Ø» ÜØÙÖ ×» Ö Ø ÔÔ»ÑÓ Ð×»ÔÖÓ ØºÖ Ö Ø Ø ×Ø»ÙÒ Ø»ÔÖÓ Ø Ø ×ØºÖ Ö Ø Ø ×Ø» ÜØÙÖ ×»ÔÖÓ Ø׺ÝÑÐ Ü ×Ø× »Ñ Ö Ø Ö Ø »Ñ Ö Ø »¼¼¾ Ö Ø ÔÖÓ Ø×ºÖ Você pode ver que o Rails gerou um template da migração, e basta editá-la: Ð ×× Ö Ø ÈÖÓ Ø× Ø Ú Ê ÓÖ Å Ö Ø ÓÒ × Ð ºÙÔ Ö Ø Ø Ð ÔÖÓ Ø× Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Ò Ò × Ð º ÓÛÒ ÖÓÔ Ø Ð ÔÖÓ Ø× Ò Ò O arquivo final seria, com base no que pensamos até o momento: Ð ×× Ö Ø ÈÖÓ Ø× Ø Ú Ê ÓÖ Å Ö Ø ÓÒ × Ð ºÙÔ Ö Ø Ø Ð ÔÖÓ Ø× Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Øº ÓÐÙÑÒ × Ö ÔØ ÓÒ¸ Ø ÜØ Ò Ò × Ð º ÓÛÒ ÖÓÔ Ø Ð ÔÖÓ Ø× Ò Ò Você não precisa se preocupar em criar todos os campos inicialmente. Você pode sempre usar outra migração para isso. Rodando o comando rake para carregar as migrações mais uma vez, temos o seguinte: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° Ö Ñ Ö Ø ´ Ò » ÓÑ »ÖÓÒ Ð Ó»ØÑÔ» Ø µ Ö Ø ÈÖÓ Ø× Ñ Ö Ø Ò ¹¹ Ö Ø Ø Ð ´ ÔÖÓ Ø×µ ¹ ¼º½ ¿× Ö Ø ÈÖÓ Ø× Ñ Ö Ø ´¼º½ ×µ O resultado final do banco seria: 35
  • 37. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° ÑÝ×ÕÐ ¹Ù ÖÓÓØ ¹Ô Ø ÑÝ×ÕÐ × ÓÛ Ø Ð × ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· Ì Ð × Ò Ø ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ÓÒØ ÜØ× ÔÖÓ Ø× × Ñ Ò Ó ·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ¿ ÖÓÛ× Ò × Ø ´¼º¼¼ × µ ÑÝ×ÕÐ × Ö ÔÖÓ Ø× ·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· Ð ÌÝÔ ÆÙÐÐ Ã Ý ÙÐØ ÜØÖ ·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ÒØ´½½µ ÆÇ ÈÊÁ ÆÍÄÄ ÙØÓ Ò Ö Ñ ÒØ Ò Ñ Ú Ö Ö´¾ µ Ë ÆÍÄÄ × Ö ÔØ ÓÒ Ø ÜØ Ë ÆÍÄÄ ·¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹·¹¹¹¹¹·¹¹¹¹¹¹¹¹¹·¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹· ¿ ÖÓÛ× Ò × Ø ´¼º¼¼ × µ ÑÝ×ÕÐ × Ð Ø ¶ ÖÓÑ × Ñ Ò Ó ·¹¹¹¹¹¹¹¹¹· Ú Ö× ÓÒ ·¹¹¹¹¹¹¹¹¹· ¾ ·¹¹¹¹¹¹¹¹¹· ½ ÖÓÛ Ò × Ø ´¼º¼¼ × µ E o arquivo db/schema.rb agora contém: Ì × Ð × ÙØÓ Ò Ö Ø º ÁÒ×Ø Ó Ø Ò Ø × Ð ¸ ÔÐ × Ù× Ø Ñ Ö Ø ÓÒ× ØÙÖ Ó Ø Ú Ê ÓÖ ØÓ Ò Ö Ñ ÒØ ÐÐÝ ÑÓ Ý ÝÓÙÖ Ø × ¸ Ò Ø Ò Ö Ò Ö Ø Ø × × Ñ Ò Ø ÓÒº Ø Ú Ê ÓÖ Ë Ñ º Ò ´ Ú Ö× ÓÒ ¾µ Ó Ö Ø Ø Ð ÓÒØ ÜØ× ¸ ÓÖ ØÖÙ Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Ò Ö Ø Ø Ð ÔÖÓ Ø× ¸ ÓÖ ØÖÙ Ó Ø Øº ÓÐÙÑÒ Ò Ñ ¸ ×ØÖ Ò Øº ÓÐÙÑÒ × Ö ÔØ ÓÒ ¸ Ø ÜØ Ò Ò Para terminar, vamos gerar a tabela e o modelo de ações: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø ÑÓ Ð Ø ÓÒ Ü ×Ø× ÔÔ»ÑÓ Ð×» Ü ×Ø× Ø ×Ø»ÙÒ Ø» 36
  • 38. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ü ×Ø× Ø ×Ø» ÜØÙÖ ×» Ö Ø ÔÔ»ÑÓ Ð×» Ø ÓÒºÖ Ö Ø Ø ×Ø»ÙÒ Ø» Ø ÓÒ Ø ×ØºÖ Ö Ø Ø ×Ø» ÜØÙÖ ×» Ø ÓÒ׺ÝÑÐ Ü ×Ø× »Ñ Ö Ø Ö Ø »Ñ Ö Ø »¼¼¿ Ö Ø Ø ÓÒ×ºÖ A migração para o modelo seria: Ð ×× Ö Ø Ø ÓÒ× Ø Ú Ê ÓÖ Å Ö Ø ÓÒ × Ð ºÙÔ Ö Ø Ø Ð Ø ÓÒ× Ó Ø Øº ÓÐÙÑÒ × Ö ÔØ ÓÒ¸ ×ØÖ Ò Øº ÓÐÙÑÒ ÓÒ ¸ ÓÓÐ Ò Øº ÓÐÙÑÒ Ö Ø Ø¸ Ø Ø Ñ Øº ÓÐÙÑÒ ÓÑÔÐ Ø Ø¸ Ø Ø Ñ Øº ÓÐÙÑÒ ÓÒØ ÜØ ¸ ÒØ Ö Øº ÓÐÙÑÒ ÔÖÓ Ø ¸ ÒØ Ö Ò Ò × Ð º ÓÛÒ ÖÓÔ Ø Ð Ø ÓÒ× Ò Ò Com isso, já temos agora o suficiente em nosso banco de dados para trabalhar um pouco em nossa aplicação. Um recurso muito útil do Rails é o console, que serve tanto para experimentar com as clas- ses de dados como para executar uma série de outras funções úteis de teste e manutenção da aplicação. Para acessar o controle, use o seguinte comando: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» ÓÒ×ÓÐ ÄÓ Ò Ú ÐÓÔÑ ÒØ ÒÚ ÖÓÒÑ Òغ Obs.: Para executar esse comando é necessário que você tenha instalado o pacote irb. A exemplo de um console de comando do DOS ou do próprio MySQL, o console do Rails permite que você insira um comando e veja seus resultados imediatamente: Por exemplo: ÓÒØ Üغ Ö Ø ´ Ò Ñ ³ÀÓÑ ³µ ÓÒØ ÜØ ¼Ü ¿ Ò Û Ö ÓÖ Ð× ¸ ÖÖÓÖ× Ø Ú Ê ÓÖ ÖÖÓÖ× ¼Ü × ÓÒØ ÜØ ¼Ü ¿ ººº ¸ ÖÖÓÖ× ß ¸ ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ O comando acima cria e salva um novo contexto, recebendo como parâmetro o nome do mesmo, descrito por seu único atributo. O resultado, visto logo depois do comando, é uma repre- sentação textual da classe. Todos objetos em Ruby, e isso inclui desde números inteiros a classe complexas, possuem uma representação textual. Na maior parte dos casos, o Ruby gera uma representação textual 37
  • 39. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF automática para classes que não especificam a sua própria representação e é isso o que você está vendo acima. Em uma aplicação, você provavelmente precisará criar um objeto e manipulá-lo antes de salvá-lo. Isso também é possível, como demonstrado abaixo: ÓÒØ ÜØ ÓÒØ ÜØºÒ Û ÓÒØ ÜØ ¼Ü ½ ¼ Ò Û Ö ÓÖ ØÖÙ ¸ ØØÖ ÙØ × ß Ò Ñ Ò Ð ÓÒØ ÜØºÒ Ñ ³ÏÓÖ ³ ÏÓÖ ÓÒØ ÜØº× Ú ØÖÙ No exemplo acima, o objeto é criado, uma de suas propriedade é atribuída e depois disso o objeto é salvo. A persistência de dados só ocorre na invocação do método save. Outras operações são possíveis: ÓÒØ Üغ Ò ´ Ðе ÓÒØ ÜØ ¼Ü ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ ¸ ÓÒØ ÜØ ¼Ü ØØÖ ÙØ × ß Ò Ñ ÏÓÖ ¸ ¾ ℄ ÓÒØ Üغ Ò ´¾µ ÓÒØ ÜØ ¼Ü ¾¿¾ ØØÖ ÙØ × ß Ò Ñ ÏÓÖ ¸ ¾ ÓÒØ Üغ Ò ´ Ö×ظ ÓÒ Ø ÓÒ× ³Ò Ñ Ð ³¸ ³ÀÓÑ ³℄µ ÓÒØ ÜØ ¼Ü ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ A primeira chamada acima retorna todos os registros correspondente aos contextos. Vemos que o resultado é um array, delimitado por []. A segunda chamada, por sua vez, retorna o objeto especificado pelo id passado, ou seja, por sua chave primária surrogada. O terceiro método, por fim, retorna o primeiro registro satisfazendo as condições passadas. O método find possui vários outros parâmetros que servem para gerar queries complexas sem esforço, ordenando o resultado, limitando a quantidade de itens retornados, e, para usos mais avançados, criando joins automaticamente. Veremos exemplos extensos disso mais adiante. A sofisticação das classes geradas pelo ActiveRecord se estende ao ponto da criação de métodos automáticos para várias situações. Algumas delas exploraremos depois, mas vale a pena notar aqui pelo menos uma delas: métodos de busca e criação automáticos. Por exemplo, é possível executar o comando abaixo para encontrar um contexto pelo seu nome: ÓÒØ Üغ Ò Ý Ò Ñ ´³ÀÓÑ ³µ ÓÒØ ÜØ ¼Ü ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ O método find_by_name não existia até ser chamado. Isso pode ser visto verificando a exis- tência do método, usando respond_to?, que é um método presente em todas as classes Ruby e, ao receber um símbolo que especifica o nome do método a ser testado, devolve uma valor indicando se a classe suporta o método ou não: ÓÒØ ÜØºÖ ×ÔÓÒ ØÓ ´ Ò Ý Ò Ñ µ 38
  • 40. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ð× ÓÒØ Üغ Ò Ý Ò Ñ ´³ÀÓÑ ³µ ÓÒØ ÜØ ¼Ü ¼ ØØÖ ÙØ × ß Ò Ñ ÀÓÑ ¸ ½ Como é fácil perceber, a classe não possui aquele método até que ele seja invocado. Uma classe de dados Rails aceita combinações quaisquer de seus atributos e de algumas operações para gerar esse tipo de métodos. Um exemplo é find_or_create_by_name, que procuraria um registro e o criaria caso não fosse encontrado, com o nome passado como parâmetro. Se a classe possuir mais atribu- tos, poderíamos muito bem usar algo como find_or_create_by_name_and_description ou ainda find_by_description_and_completed_at. É claro que se usarmos isso para todas as chamadas, teremos métodos com nomes absurda- mente longos como find_or_create_by_description_and_created_at_and_completed_at_and_done que ficariam bem melhor como chamadas separadas usando condições por questões de legibili- dade. O que estamos fazendo aqui no console é basicamente o que faremos em uma aplicação no que tange à manipulação de dados. Como você pode ver, na maior parte dos casos, o Rails não exige que o desenvolvedor escreva código SQL, gerando o código necessário por trás das cenas, com toda eficiência possível. E caso seja necessário, há ainda duas possilidades: usar parâmetros mais avançados do método find, que permitem a inserção de fragmentos de SQL em uma operação qualquer; ou ainda, usar métodos como find_by_sql que permitem um execução direta no banco com integração plena com o Rails. Usar as facilidades do Rails não significa que o desenvolvedor não precisa conhecer SQL; ao contrário, o conhecimento é fundamental, tanto para evitar problemas no uso do próprio Rails como para todas outras tarefas que existem além do Rails. Agora que já trabalhamos um pouco com o modelo de dados, vamos passar para a aplicação em si. 39
  • 41. Capítulo 5 MVC e CONTROLLER Essa lição tem como objetivo explicar o que se trata o MVC e como fazer o primeiro CON- TROLLER 5.1 MVC Como mencionado anteriormente, o Rails utilizado a estratégia MVC. A parte correspondente ao Model existe nas classes de dados e é implementada pelo ActiveRecord. Um segundo compo- nente do Rails, o ActionPack, implementa o V e o C que são respectivamente View e Controller. Um controller é uma classe responsável por receber as requisições feitas pela aplicação e executar as ações necessárias para atender essas requisições. Essas ações, ao serem executa- das, provavelmente causarão mudanças no banco que serão efetuadas, por sua vez, por uma ou mais classes de dados. Finalmente, o resultado será exibido através de uma view, que será retornada ao usuário na forma de HTML, imagens, XML, ou qualquer outra saída aceitável da aplicação. As três partes da estratégia MVC são independentes no Rails como deveriam ser em qual- quer boa implementação das mesmas. Qualquer modelo de dados pode ser utilizado indepen- dentemente, inclusive em scripts que não tem a ver com a aplicação Web em si, como, por exemplo, tarefas agendadas. Os controllers também são independentes e podem ser usado para simplesmente efetuar ações que nem mesmo retornam views, atualizando somente o banco ou disparando outro processo qualquer no servidor. As views são, de certa forma, a parte mais de- pendente já que, embora podendo ser utilizadas separadamente, não fazem muito sentido sem utilizarem dados gerados por modelos de dados e controllers. Para identificar qual controller será responsável por atender uma determinada solicitação da aplicação, o Rails utiliza uma mecanismo de roteamento de requisições automático que não ne- cessita de configurações complexas, mas que pode também ser customizado de acordo com as necessidades de cada aplicação. A regra principal de roteamento no Rails forma URLs segundo o padrão /controller/action/id, onde controller é a classe responsável por atender a requisição especificada por aquela URL, action é um método dentro da classe e id é um parâmetro opcional passado para identificar um objeto qualquer sobre o qual a ação será efetuada. Como dito anteriormente, esse padrão pode ser modificado e veremos mais sobre isso adiante no tutorial. 40
  • 42. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF 5.2 O primeiro controller Vamos começar criando um controller para lidar com a página inicial de nossa aplicação. Para gerar um controller, usamos o comando abaixo: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø ÓÒØÖÓÐÐ Ö ÓÑ Ü ×Ø× ÔÔ» ÓÒØÖÓÐÐ Ö×» Ü ×Ø× ÔÔ» ÐÔ Ö×» Ö Ø ÔÔ»Ú Û×» ÓÑ Ü ×Ø× Ø ×Ø» ÙÒ Ø ÓÒ Ð» Ö Ø ÔÔ» ÓÒØÖÓÐÐ Ö×» ÓÑ ÓÒØÖÓÐÐ ÖºÖ Ö Ø Ø ×Ø» ÙÒ Ø ÓÒ Ð» ÓÑ ÓÒØÖÓÐÐ Ö Ø ×ØºÖ Ö Ø ÔÔ» ÐÔ Ö×» ÓÑ ÐÔ ÖºÖ O nome passado para o comando é home, que será usado para compor todos os arquivos gerados pelo mesmo. Da mesma forma que nos modelos de dados, o Rails cria unit tests para a classe gerada, que podem ser executados com o comando rake tests. Esse comando roda todos os unit tests presentes na aplicação e qualquer boa aplicação desenvolvida segundo a metodologia Extreme Programming faz uso extensivo dessa técnica. Veremos esse assunto em mais detalhes em uma outra seção de nosso tutorial. Se você acessar a URL desse controller agora, você vai receber a seguinte tela: Figura 2 41
  • 43. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Repare que, nesse caso, eu informei somente /controller/ como a URL, sem passar nem a parte correspondente a uma ação ou a um id. Nesse caso, o Rails assume que estamos invocando a ação index sem id. Esse é um mais exemplo de convenção ao invés de configuração. Ao invés de ter sempre que especificar uma ação padrão em algum lugar, o Rails convenciona que a ação padrão é index, poupando o desenvolvedor sem afetar a aplicação. Vamos olhar o arquivo app/controllers/home_controller.rb gerado por nosso comando. Como já mencionamos, o Rails segue uma estrutura fixa de diretórios, poupando mais uma vez o de- senvolvedor. Arquivos relacionados ao banco vão em no diretório db, arquivos de configuração em config e tudo relacionado a MVC vai em app. Dentro de app temos vários outros diretórios que contém mais partes específicas da aplicação. Em alguns casos, o Rails também adiciona um sufixo ao arquivo, evitando colisões de nomes e problemas estranhos na aplicação, como é o caso aqui. O arquivo do controller criado contém o seguinte: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ò A classe HomeController define quem que irá responder a requisições padrão em /home. Ela herda da classe ApplicationController, que está definida no arquivo application.rb, no mesmo diretório. Sendo assim, qualquer método criado na classe ApplicationController estará automati- camente disponível nos controllers gerados para a aplicação. O uso de herança serve mais uma vez para beneficiar o desenvolvedor que pode utilizar um modelo mental familiar para trabalhar sua aplicação, um modelo que é ao mesmo tempo simples e poderoso. Para criarmos a ação index, basta adicionarmos um método à classe: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ò Ü Ò Ò O princípio que usamos acima é comum a tudo em Rails. Basicamente tudo o que fazemos em uma aplicação usando o mesmo consiste em extender alguma classe por meio da adição de métodos customizados. Recarregando a página no navegador, ficamos com o seguinte: 42
  • 44. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 3 Vamos que, dessa vez, o Rails identificou a ação a ser executada, mas, como a aplicação não especificou nenhum retorno, houve um erro. Isso aconteceu porque o Rails tentou aplicar automaticamente uma view para aquela ação do controller. Como a view ainda não existe, temos o erro. Antes de nos aventurarmos em uma view usando o mecanismo de templates do Rails, vamos retornar algum texto por contra própria: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ò Ü Ö Ò Ö Ø ÜØ ÇÐ Ò Ò O método render, disponível para qualquer controller ou view, gera saída na aplicação, saída esta que depende de seus parâmetros. No caso acima, estamos renderizando texto puro, como indicado pelo parâmetro text. Nossa página agora ficaria assim: 43
  • 45. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 4 Temos a nossa primeira saída em uma aplicação Rails. Como escrever manualmente toda a saída não é o que queremos, vamos criar a nossa pri- meira view. Para isso, criamos o arquivo app/views/home/index.rhtml. A extensão .rhtml indica que esse arquivo contém HTML e código Ruby. Uma outra extensão possível seria .rjs para gerar retorno em JavaScript, comumente utilizado em aplicações Ajax. Há ainda .rxml, para gerar saída em XML. Outros mecanismos de tem- plate podem usar outras extensões, já que o Rails pode ser configurado para outros mecanismos alternativos. Por hora, usaremos a linguagem de templates padrão do Rails. Vamos criar o seguinte ar- quivo, então: Ô ÇÐ ¸ ÑÙÒ Ó »Ô Se recarregamos a página, notaremos que nada mudou. Isso acontece porque estamos usando render diretamente. Nesse caso, o Rails detecta que alguma saída já foi gerada e não tenta gerar outra. Basta, então, remover a chamada a render método index, voltando o arquivo a: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö 44
  • 46. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ò Ü Ò Ò Agora, recarregando a página, temos: Figura 5 Sem que haja necessidade de especificar qualquer coisa, o Rails está usando o arquivo ade- quado. Veja que não configuramos qualquer coisa. Criamos um controller, definimos um método no mesmo, e criamos um arquivo que contém o que queremos que seja retornado por aquele método. A simples existência desses arquivos representa uma cadeia de execução sem que precisamos nos preocupar com que parte da aplicação faz isso ou aquilo. Qualquer outra ação que fosse criada dentro desse controller seguiria o mesmo padrão. O nome da ação seria associado a um nome de arquivo dentro de um diretório em app/views cujo nome seria o do próprio controller. O Rails também é inteligente ao ponto de responder a uma ação mesmo que o método não exista, desde que a view esteja presente no diretório correto. 45
  • 47. Capítulo 6 Layouts e Roteamento Essa lição tem como finalidade facilitar o desenvolvimento da parte visual de uma aplicação. Para isso, o Rails possui um conceito denominado layouts. E o roteamento é para satisfazer a URL que foi especificada. 6.1 Layouts Na maioria das aplicações Web, as páginas variam somente no seu conteúdo principal, pos- suindo cabeçalhos, rodapés e barras de navegação em comum. Obviamente, um framework cujo maior objetivo é aumentar a produtividade do desenvolvedor não exigiria que o código para esses elementos tivesse que ser repetido em cada view. Um layout funciona como um arquivo raiz, dentro do qual o resultado de uma view é inserido automaticamente. Mais uma vez favorecendo convenção ao invés de configuração, o Rails define um arquivo pa- drão de layout que é usado automaticamente por qualquer view a não ser que haja especificação em contrário. O Rail também é inteligente o bastante para somente usar um layout em views com a mesma extensão. O layout padrão para a aplicação fica em um arquivo chamado application.rhtml, dentro do diretóri app/views/layouts, que não existe ainda. Se você olhar agora o código gerado pela página que criamos até o momento, você verá o seguinte: 46
  • 48. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 6 Como você pode notar, ão estamos gerando nenhum dos elementos HTML geralmente vistos em uma página comum. Vamos criar o arquivo application.rhtml no diretório especificado, com o seguinte conteúdo: ØÑÐ Ø ØÐ Ì »Ø ØÐ » Ó Ý ± Ý Ð ± » Ó Ý » ØÑÐ Temos no arquivo acima, o primeiro exemplo de uso de código Ruby dentro de uma view, delimitado pelos marcadores % e %. Aqueles familiarizados com PHP e ASP reconhecerão o estilo de marcadores, com o uso de %= objeto % para retornar conteúdo. No caso acima, o método especial yield retorna o conteúdo atual gerado pela ação, seja por meio de uma view ou usando render diretamente. O método yield tem uma conotação especial 47
  • 49. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF no Ruby, servindo para invocar o bloco associado ao contexto. Inserido em um layout do Rails, o bloco define a execução da ação, com seu conseqüente retorno de conteúdo. A nossa página recarregada agora fica como mostrado abaixo: Figura 7 Não parece muita coisa, mas, olhando o código, você verá o seguinte: 48
  • 50. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 8 É fácil perceber que o código do layout foi aplicado sobre o código da view, gerando a saída final da aplicação. O que precisamos fazer agora é extender o nosso layout para incluir algumas amenidades. O nosso arquivo application.rhtml poderia ser mudado para o seguinte: ØÑÐ Ø ØÐ Ì »Ø ØÐ ± ×ØÝÐ × Ø Ð Ò Ø ÙÐØ ± » Ó Ý ± Ý Ð ± » Ó Ý » ØÑÐ O método stylesheet_link_tag recebe o nome de uma stylesheet como parâmetro e gera um link para a mesma. O nosso código gerado agora ficou assim: 49
  • 51. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 9 Note que mais uma vez o Rails assumiu um caminho padrão. Nesse caso, o arquivo é servido diretamente da raiz da aplicação, que é o diretório public. Você pode criar um arquivo chamado default.css no diretório public/stylesheets para adicioná-lo à aplicação. Um exemplo disso seria: Ó Ý ß ÓÒع Ñ ÐÝ Î Ö Ò ¸ Ö Ð¸ × Ò×¹× Ö ÓÒØ¹× Þ ¼± Uma coisa a manter em mente é que o layout padrão da aplicação não é, de forma alguma, o único que pode ser gerado. Você pode criar tantos layouts quanto precisar, colocando-os no mesmo diretório, de onde estarão acessíveis a toda aplicação. Para usar um layout diferente em um controler você poderia fazer algo assim: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ð ÝÓÙØ ÓÑ 50
  • 52. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ò Ü Ò Ò O layout cujo nome é home seria especificado no arquivo app/views/layouts/home.rhtml, com a mesma funcionalidade do arquivo application.rhtml. Uma outra possibilidade que o Rails oference é sobrescrever um layout para uma única ação, diretamente no método render. Um exemplo seria: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ð ÝÓÙØ ÓÑ Ò Ü Ò Ò Ü ×Ô Ð Ö Ò Ö Ø ÓÒ Ð ×Ø ¸ Ð ÝÓÙØ ÓÑ ×Ô Ð Ò Ò Você pode também suprimir inteiramente um layout usando :layout = false. Finalmente, você pode usar maneiras específicas de determinar o layout de uma página. Por exemplo: Ð ×× ÀÓÑ ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ð ÝÓÙØ ÓÓ× Ð ÝÓÙØ Ò Ü Ò ÔÖÓØ Ø ÓÓ× Ð ÝÓÙØ ´ ÙÖÖ ÒØ Ù× Öº Ñ Ò µ Ñ Ò ×ØÖ Ø ÓÒ ÒÓÖÑ Ð Ò Ò No caso acima, dependendo do retorno da chamada ao método admin?, a aplicação poderia usar o layout definido no arquivo administration.rhtml ou no arquivo normal.rhtml. Como podemos ver não há muitos limites para o que pode ser feito. 6.2 Roteamento Se você acessou a URL raiz da aplicação, você terá notado que ela não mudou, apesar do controller que criamos. Isso acontece porque o Rails define um arquivo index.html que serve como padrão. Se removermos esse arquivo do diretório public, ficaremos com a seguinte página: 51
  • 53. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 10 Esse erro indica que o Rails não consegue encontrar um roteamento que satisfaça a URL que especificamos. Para resolvermos o problema, vamos editar o arquivo config/routes.rb, que define esses roteamentos. Esse arquivo contém o seguinte codigo: Ø ÓÒ ÓÒØÖÓÐÐ Ö ÊÓÙØ Ò ÊÓÙØ ×º Ö Û Ó Ñ Ô Ì ÔÖ ÓÖ ØÝ × × ÙÔÓÒ ÓÖ Ö Ó Ö Ø ÓÒ Ö×Ø Ö Ø ¹ ×Ø ÔÖ ÓÖ Øݺ Ë ÑÔÐ Ó Ö ÙÐ Ö ÖÓÙØ Ñ Ôº ÓÒÒ Ø ³ÔÖÓ Ù Ø×» ³¸ ÓÒØÖÓÐÐ Ö ³ Ø ÐÓ ³¸ Ø ÓÒ ³Ú Û³ Ã Ô Ò Ñ Ò ÝÓÙ Ò ×× Ò Ú ÐÙ × ÓØ Ö Ø Ò ÓÒØÖÓÐÐ Ö Ò Ø ÓÒ Ë ÑÔÐ Ó Ò Ñ ÖÓÙØ Ñ ÔºÔÙÖ × ³ÔÖÓ Ù Ø×» »ÔÙÖ × ³¸ ÓÒØÖÓÐÐ Ö ³ Ø ÐÓ ³¸ Ø ÓÒ ³ÔÙÖ × ³ Ì × ÖÓÙØ Ò ÒÚÓ Û Ø ÔÙÖ × ÙÖд ÔÖÓ Ù Øº µ ÓÙ Ò Ú Ø ÖÓÓØ Ó ÝÓÙÖ × Ø ÖÓÙØ Ý ÓÓ Ò ÙÔ ³³ ¹¹ Ù×Ø Ö Ñ Ñ Ö ØÓ Ð Ø ÔÙ Ð » Ò Üº ØÑк Ñ Ôº ÓÒÒ Ø ³³¸ ÓÒØÖÓÐÐ Ö Û Ð ÓÑ ÐÐÓÛ ÓÛÒÐÓ Ò Ï Ë ÖÚ ÏË Ä × Ð Û Ø Ò ÜØ Ò× ÓÒ Ò×Ø Ó Ð Ò Ñ ³Û× Ð³ Ñ Ôº ÓÒÒ Ø ³ ÓÒØÖÓÐÐ Ö»× ÖÚ ºÛ× Ð³¸ Ø ÓÒ ³Û× Ð³ 52
  • 54. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF ÁÒ×Ø ÐÐ Ø ÙÐØ ÖÓÙØ × Ø ÐÓÛ ×Ø ÔÖ ÓÖ Øݺ Ñ Ôº ÓÒÒ Ø ³ ÓÒØÖÓÐÐ Ö» Ø ÓÒ» ³ Ò Como os comentários dizem, esse arquivo define roteamentos de URLs para controllers. Cada roteamento é examinado quando uma URL é processada pelo Rails, da primeira para a última, sendo a ordem de declaração a definição de prioridade. Como você pode ver no arquivo acima, a URL padrão que mencionamos, /controller/action/id é a última a ser definida, sendo a aplicada caso não haja instruções em contrário. O roteamento no Rails é bem rico e trabalharemos alguns dos conceitos do mesmo mais adiante. No momento, queremos apenas resolver o problema da página inicial. Essa página é representada no arquivo acima pela linha abaixo, comentada no momento. Ñ Ôº ÓÒÒ Ø ³³¸ ÓÒØÖÓÐÐ Ö Û Ð ÓÑ Para mapear o controller home como nossa página inicial, basta modificar a linha para dizer o seguinte: Ñ Ôº ÓÒÒ Ø ³³¸ ÓÒØÖÓÐÐ Ö ÓÑ A rota vazia é um sinônimo para a rota raiz e estamos dizendo, com o código acima que se a mesma for invocada, a requisição deve ser servida pelo controller que definimos anteriormente. Note a mistura de aspas simples e aspas duplas nesse arquivo. No Ruby, elas são relativa- mente intercambiáveis e são apenas duas das várias formas de representar texto nessa lingua- gem. A diferença é que as aspas duplas permitem a interpolação de variáveis como veremos mais adiante no tutorial. Eu tendo a favorecer o uso de aspas duplas, nas isso é uma opção pessoal. Agora, recarregando nossa página inicial temos: 53
  • 55. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 11 Note que agora o mesmo controller serve dois roteamentos. Essa é apenas uma das possibi- lidades mais simples que estão disponíveis com o roteamento do Rails. Agora que temos um conhecimento básico de models, controllers e views, podemos combinar o três. 54
  • 56. Capítulo 7 Scaffolding e Validações Para ajudar na rápida prototipação de aplicações, o Rails possui algo chamado de scaffolding. E Validações, como o próprio nome indica, são um modo de garantir a integridade dos dados em uma aplicação. 7.1 Scaffolding O scaffolding provê uma estrutura básica para operações CRUD (Create, Retrieve, Update and Delete), ou seja, aquelas operações básicas que temos na manipulação de dados, gerando interfaces rápidas que podem apoiar o desenvolvimento até que você insira a codificação neces- sária. Para experimentar com isso e expandir um pouco nossa aplicação, vamos criar um novo controller, que servirá para administrar os nossos contextos: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø ÓÒØÖÓÐÐ Ö ÓÒØ ÜØ× Ü ×Ø× ÔÔ» ÓÒØÖÓÐÐ Ö×» Ü ×Ø× ÔÔ» ÐÔ Ö×» Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ× Ü ×Ø× Ø ×Ø» ÙÒ Ø ÓÒ Ð» Ö Ø ÔÔ» ÓÒØÖÓÐÐ Ö×» ÓÒØ ÜØ× ÓÒØÖÓÐÐ ÖºÖ Ö Ø Ø ×Ø» ÙÒ Ø ÓÒ Ð» ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö Ø ×ØºÖ Ö Ø ÔÔ» ÐÔ Ö×» ÓÒØ ÜØ× ÐÔ ÖºÖ Inicialmente, esse controller é como o que criamos anteriormente, para a home da aplicação, e não possui nenhuma ação pré-definida. Vamos editar o seu arquivo, em app/controllers/contexts_controller.rb, acrescentando uma linha de código: Ð ×× ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö × ÓÐ ÓÒØ ÜØ Ò Agora, acesse a URL desse controller, digitando http://localhost:3000/contexts no navega- dor que você estiver usando: 55
  • 57. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 12 Sem nenhuma linha de código além da inserida acima, temos listagem, inserção, atualização e remoção de contextos. Clique em New context para experimentar: 56
  • 58. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 13 Depois, clicando em Create, temos: 57
  • 59. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 14 E, finalmente, clicando em Show, vemos: 58
  • 60. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Figura 15 Note, que na tela acima, o id do objeto já aparece na URL. Nesse caso é 5 porque eu já experimentara antes com outros objetos. O scaffolding é muito útil na geração de controllers básicos de administração para dar apoio à prototipação e ao início do desenvolvimento, principalmente para cadastros, permitindo que o desenvolvedor se foque no que é mais importante para a aplicação. O inconveniente é que as ações geradas são bem limitadas e não podem ser editadas ou traduzidas. Para expandir um pouco a funcionalidade, existe outra forma de geração de scaffolding que permite uma flexibilidade maior na edição das páginas geradas, que podem, inclusive, ser utiliza- das como base para as páginas finais. Para isso, use o comando abaixo: ÖÓÒ Ð ÓÑ Ò ÖÚ »ØÑÔ» Ø ° × Ö ÔØ» Ò Ö Ø × ÓÐ ÓÒØ ÜØ Ü ×Ø× ÔÔ» ÓÒØÖÓÐÐ Ö×» Ü ×Ø× ÔÔ» ÐÔ Ö×» Ü ×Ø× ÔÔ»Ú Û×» ÓÒØ ÜØ× Ü ×Ø× Ø ×Ø» ÙÒ Ø ÓÒ Ð» Ô Ò Ò Ý ÑÓ Ð Ü ×Ø× ÔÔ»ÑÓ Ð×» 59
  • 61. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ü ×Ø× Ø ×Ø»ÙÒ Ø» Ü ×Ø× Ø ×Ø» ÜØÙÖ ×» ÒØ Ð ÔÔ»ÑÓ Ð×» ÓÒØ ÜØºÖ ÒØ Ð Ø ×Ø»ÙÒ Ø» ÓÒØ ÜØ Ø ×ØºÖ ÒØ Ð Ø ×Ø» ÜØÙÖ ×» ÓÒØ ÜØ׺ÝÑÐ Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ×» ÓÖÑºÖ ØÑÐ Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ׻Р×ØºÖ ØÑÐ Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ×»× ÓÛºÖ ØÑÐ Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ×»Ò ÛºÖ ØÑÐ Ö Ø ÔÔ»Ú Û×» ÓÒØ ÜØ×» ØºÖ ØÑÐ ÓÚ ÖÛÖ Ø ÔÔ» ÓÒØÖÓÐÐ Ö×» ÓÒØ ÜØ× ÓÒØÖÓÐÐ ÖºÖ Ò Õ℄ Ý ÓÖ ÔÔ» ÓÒØÖÓÐÐ Ö×» ÓÒØ ÜØ× ÓÒØÖÓÐÐ ÖºÖ ÓÚ ÖÛÖ Ø Ø ×Ø» ÙÒ Ø ÓÒ Ð» ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö Ø ×ØºÖ Ò Õ℄ Ý ÓÖ Ø ×Ø» ÙÒ Ø ÓÒ Ð» ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö Ø ×ØºÖ ÒØ Ð ÔÔ» ÐÔ Ö×» ÓÒØ ÜØ× ÐÔ ÖºÖ Ö Ø ÔÔ»Ú Û׻РÝÓÙØ×» ÓÒØ ÜØ×ºÖ ØÑÐ Ö Ø ÔÙ Ð »×ØÝÐ × Ø×»× ÓÐ º ×× Note que, para a geração de um scaffold por esse comando, o nome do modelo de dados é que deve ser passado como parâmetro, e não o nome do controller. O Rails é capaz de derivar um do outro. Esse comando gera a classe do modelo de dados, o controller e views para cada ação CRUD necessária. No caso acima, como o model já existia, ele não foi criado, e foi necessário sobres- crever alguns arquivos. Há duas coisas a serem notadas aqui. Primeiro, o scaffold gerou o seu próprio layout, com sua própria stylesheet. Por causa disso, o layout original da aplicação foi perdido. Uma solução aqui será remover o arquivo app/views/layouts/contexts.rhtml, já que não precisamos dele, e adicionar a stylesheet scaffold.css ao arquivo application.rhtml. Segundo, as views criadas continuam razoavelmente limitadas, como veremos adiante. Abrindo o novo arquivo gerado do controller, temos o seguinte: Ð ×× ÓÒØ ÜØ× ÓÒØÖÓÐÐ Ö ÔÔÐ Ø ÓÒ ÓÒØÖÓÐÐ Ö Ò Ü Ð ×Ø Ö Ò Ö Ø ÓÒ ³Ð ×س Ò Ì× × ÓÙÐ × ´× ØØÔ »»ÛÛÛºÛ¿ºÓÖ »¾¼¼½»Ø » Ó »Û ÒÌÓÍ× Øº ØÑе Ú Ö Ý Ñ Ø Ó ÔÓ×ظ ÓÒÐÝ ×ØÖÓݸ Ö Ø ¸ ÙÔ Ø ℄¸ Ö Ö Ø ØÓ ß Ø ÓÒ Ð ×Ø Ð ×Ø ÓÒØ ÜØ Ô ×¸ ÓÒØ ÜØ× Ô Ò Ø ÓÒØ ÜØ׸ Ô Ö Ô ½¼ Ò × ÓÛ ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ Ò Ò Û ÓÒØ ÜØ ÓÒØ ÜØºÒ Û Ò 60
  • 62. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasília/DF Ö Ø ÓÒØ ÜØ ÓÒØ ÜØºÒ Û´Ô Ö Ñ× ÓÒØ ÜØ℄µ ÓÒØ ÜØº× Ú Ð × ÒÓØ ℄ ³ ÓÒØ ÜØ Û × ×Ù ×× ÙÐÐÝ Ö Ø º³ Ö Ö Ø ØÓ Ø ÓÒ ³Ð ×س Ð× Ö Ò Ö Ø ÓÒ ³Ò Û³ Ò Ò Ø ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ Ò ÙÔ Ø ÓÒØ ÜØ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µ ÓÒØ ÜغÙÔ Ø ØØÖ ÙØ ×´Ô Ö Ñ× ÓÒØ ÜØ℄µ Ð × ÒÓØ ℄ ³ ÓÒØ ÜØ Û × ×Ù ×× ÙÐÐÝ ÙÔ Ø º³ Ö Ö Ø ØÓ Ø ÓÒ ³× ÓÛ³¸ ÓÒØ ÜØ Ð× Ö Ò Ö Ø ÓÒ ³ س Ò Ò ×ØÖÓÝ ÓÒØ Üغ Ò ´Ô Ö Ñ× ℄µº ×ØÖÓÝ Ö Ö Ø ØÓ Ø ÓÒ ³Ð ×س Ò Ò O resultado final, ao ser executado, é muito parecido com o do método scaffold, com a maior diferença sendo os arquivos de gerados enquanto que, do modo anterior, as ações eram dinami- camente criadas pelo Rails. Algumas amenidades, como paginação, também foram introduzidas. Uma consideração deve ser feita aqui: o scaffolding é apenas um apoio à prototipação. Ele não deve ser usado como uma muleta, gerando páginas para modificação. Se você quer adminis- trações prontas, existem plugins para o Rails que permitem a geração de páginas bem avançadas. Esses plugins podem ser utilizados para criar administrações prontas a exemplo das geradas pelo Django (o framework equivalente ao Rails para o Python), mas mesmo elas tem suas limitações e inflexibilidades. A lição é sempre procurar o que é melhor para a sua aplicação. Os scaffoldings são uma visão muito linear de uma aplicação e não levam em contra interfaces alternativas de melhor usabilidade. De qualquer forma, o scaffolding gerado é uma boa oportunidade para ver o relacionamento entre controllers, views e models. Se você tomar uma ação qualquer como exemplo, verá que ela usa a classe de dados para o acesso ao banco e empacota os dados recebidos em variáveis fechadas que serão usadas por uma view, evitando que o código de apresentação se misture com a lógica de negócio. Mesmo elementos do próprio controller, como paginação, são incluidos nessa discriminação. Veja a view de listagem, por exemplo, descrita no arquivo list.rhtml no diretório app/views/contexts: ½ Ä ×Ø Ò ÓÒØ ÜØ× » ½ Ø Ð ØÖ 61