O documento apresenta um plano de ensino para um curso sobre Ruby on Rails. Apresenta tópicos como objetivo, público-alvo, pré-requisitos, cronograma e programação do curso. Também inclui informações sobre licença do conteúdo e instalação do framework Ruby on Rails.
Drivers de dispositivo são a interface necessária entre o sistema operacional e o hardware do seu computador. Drivers são responsáveis por controlar de forma correta os dispositivos e esconder do próprio sistema operacional os detalhes de baixo nível.
Drivers de dispositivo são a interface necessária entre o sistema operacional e o hardware do seu computador. Drivers são responsáveis por controlar de forma correta os dispositivos e esconder do próprio sistema operacional os detalhes de baixo nível.
proposta curricular para educação de jovens e adultos- Língua portuguesa- anos finais do ensino fundamental (6º ao 9º ano). Planejamento de unidades letivas para professores da EJA da disciplina língua portuguesa- pode ser trabalhado nos dois segmentos - proposta para trabalhar com alunos da EJA com a disciplina língua portuguesa.Sugestão de proposta curricular da disciplina português para turmas de educação de jovens e adultos - ensino fundamental. A proposta curricular da EJa lingua portuguesa traz sugestões para professores dos anos finais (6º ao 9º ano), sabendo que essa modalidade deve ser trabalhada com metodologias diversificadas para que o aluno não desista de estudar.
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
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
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