Revista_PROGRAMAR_30
-
Upload
ricardo-palma -
Category
Documents
-
view
222 -
download
0
Transcript of Revista_PROGRAMAR_30
-
8/3/2019 Revista_PROGRAMAR_30
1/90
-
8/3/2019 Revista_PROGRAMAR_30
2/90
2
Erro: Ttulo no definido
Cada vez mais exigido rigor em todos os aspectos nas mais variadas reas. A pro-gramao no excepo, tanto mais se pensarmos que cada vez mais a tecnologiafaz parte da vida das pessoas. Nos dias que correm natural exigir que qualqueraplicao no possua erros de compilao nem os famosos warnings. Todavia estesso sem dvida os mais fceis de corrigir. O problema quando aparecem os deno-minados erros de runtime. Algo que o programador no previu no seu algoritmo eque se pode tornar numa autntica bomba, capaz de detonar o programa todo. E sepensarmos que numa aplicao de contabilidade, o que poder acontecer ser ne-cessrio repetir a operao, no caso de uma aplicao de uma nave espacial, porexemplo, o caso de uma diviso por zero que no seja protegida, quando a naveest a calcular o ngulo de entrada na atmosfera, pode determinar a diferena entreo prejuzo de milhes e o lucro, talvez at entre a vida e a morte.
Ao contrrio de muitas outras reas, a programao no ainda alvo da chamadaprova cientfica, apesar de Informtica ser considerada uma cincia. Se perguntar-mos a um Engenheiro Civil a razo porque determinada ponte no ca, ele explicar-nos- com clculos matemticos que garantem a estabilidade da ponte. Se pergun-tarmos grande maioria dos Programadores ou at Engenheiros Informticos o por-qu do programa funcionar correctamente, muito dificilmente obteremos uma respos-ta com prova cientfica.
Para percebermos o parte do drama basta ver problemas de segurana bsicos que
existem em muitas aplicaes na Web e fora dela. Muitas vezes a criao de umprograma deixa de ser uma sequncia de passos j definidos, para ser inspirao damusa da programao, e onde se escrevem linhas e linhas de cdigo, simples frutosde sbita (des)inspirao. Em vez de programadores passam a poetas, que se inspi-ram na sua musa, e que em vez de Redondilhas criam Centilhas. Muitas vezessem perceberem que esto a fazer algo e a desfazer nas linhas seguintes, e onde sest a ser gasto processamento.
A verdade que os erros no vo desaparecer completamente, porque continumosa ver erros na nossa civilizao que custam dinheiro e at vidas. Todavia, e feliz-mente o nmero de pontes, avies e outras invenes no caem com tanta fre-
quncia como caem as aplicaes. Porque a o problema est muitas vezes no serhumano que verificou, e que fez um erro na verificao. Por isso era provvel queconsegussemos melhores resultados se fosse feita uma aposta forte no clculo ecorreco de algoritmos.
Antnio Silva
A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, nopodendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro. Para qualquer dvida ou esclarecimento
poder sempre contactar-nos.
CoordenadoresAntnio Silva
Fernando Martins
EditorFbio Domingos
Jorge Paulino
DesignSrgio Alves
Twitter: @scorpion_blood
RedacoAndr Lage, Augusto Manzano,
Bruno Lopes, Bruno Pires,Carlos Rodrigues, Fbio Domingos,
Flvio Geraldes, Joo Tito Lvio,Niko Neugebauer, Nuno Godinho
StaffAntnio Santos, Fbio Canada
Pedro Martins, Sara Santos
Contactorevistaprogramar@portugal-a-
programar.org
Websitehttp://www.revista-programar.info
ISSN1 647-071 0
mailto:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]://www.revista-programar.info/http://www.revista-programar.info/http://www.revista-programar.info/http://www.revista-programar.info/http://www.revista-programar.info/mailto:[email protected]:[email protected] -
8/3/2019 Revista_PROGRAMAR_30
3/90
3
TEMA DE CAPA
Introduo ao Ruby on RailsConhea as bases da tecnologia Ruby on Rails para desenvolvimento de pginas web. Carlos Rodrigues.
A PROGRAMAR
COLUNAS
COMUNIDADES
EVENTOS
08 Ago -Damian Conway em Lisboa - Fun with Dead Languages10 Ago -Summer Tech Refresh - Lisboa16 Ago -XIV encontro da Comunidade SQLPort27 Ago -Reunio presencial Comunidade NetPonto - Lisboa24 Set -WordCamp Lisboa 2011 (Comunidade Portuguesa de WordPress)
24 Set-
2 Aniversrio da Comunidade NetPonto
Para mais informaes/eventos: http://bit.ly/PAP_Eventos
Lua - Parte 10A continuao de um excelente artigo sobre LUA, uma linguagem de programao pouco conhecida. Nesta dcimaparte, saiba como embeber a linguagem LUA em programas escritos em C e C++, bem como pode utilizar co -rotinas.
Augusto Manzano.
Criar um sistema RSS no Sharepoint atravs de uma lista de pginasConhea uma forma simples e eficaz de atravs de RSS 2.0 fazer um response directamente numa pgina ASPX
com um controlo de utilizador. Joo Tito Lvio.
Introduo ao Objective-C e plataforma iOS
Um artigo de introduo linguagem da Apple Objective -C e plataforma iOS utilizada nos dispositivos iPod Touch,iPhone e iPad. Bruno Pires.
Atributos em C#Saiba como colocar metadados em aplicaes C# atravs de atributos. Flvio Geraldes
Visual (NOT) Basic - Tipos GenricosConhea estas estruturas que possuem bastantes vantagens sobre os Arrays. Fbio Domingos.
7
30
AzurePT - Windows Azure Traffic ManagerConhea esta funcionalidade que possibilita a resoluo de vrios problemas relacionados com Cloud Computing.
Nuno Godinho.
SQLPort - Ferramentas gratuitas de trabalho com SQL ServerConhea algumas ferramentas gratuitas que podem facilitar e acelerar o trabalho com o SQL Server.
Niko Neugebauer.
NetPonto - NHibernate - do Import Package primeira iteraoComo configurar e utilizar o NHibernate com FluentNHibernate para fazer a ponte entre as nossas classes em .NET e
as nossas tabelas de bases de dados. Bruno Lopes.
SharePointPT-
Sandboxed Solutions em SharePoint Online 2010
Veja como criar Sandbox Solution utilizando os diversos Templates disponibilizados para o Visual Studio 2010. AndrLage
36
41
45
51
59
67
74
84
http://bit.ly/PAP_Eventoshttp://bit.ly/PAP_Eventoshttp://bit.ly/PAP_Eventos -
8/3/2019 Revista_PROGRAMAR_30
4/90
4
Investigadores do ISEP desenvolvemsoftware para tornar os motores de
busca mais eficientes
Uma equipa de investigadores portugueses do Instituto Supe-rior de Engenharia do Porto (ISEP) est envolvido num projec-to da Microsoft que pretende desenvolver um novo software,com o objectivo de tornar os motores de busca mais rpidos,mais directos, mais eficazes e mais "inteligentes". A ideia permitir que os utilizadores da Internet obtenham informaomais concreta e direccionada, na altura da pesquisa.Ou seja, "o objectivo que os motores de busca sejam capa-zes de relacionar os parmetros pedidos pelos cibernautas eforneam respostas concretas, relacionando a informaocomo um raciocnio lgico", explicam os investigadores doISEP. Actualmente, o software implementado nos motores debusca no capaz de absorver e processar a informao que exclusivamente destinada ao ser humano. O sistema ape-nas orientado para a apresentao de informao. O proces-samento e as concluses ficam para o utilizador. O softwareque est a ser desenvolvido pelo ISEP ser capaz de proces-sar os dados pedidos pelo cibernauta e pesquisar os concei-tos na web, no de forma isolada, mas relacionando-os entresi. Olhando para um caso concreto, pergunta "quais osapartamentos T2 existentes, com menos de 10 anos, paraarrendar, a menos de 500 metros da Trindade, Plo Universi-trio ou Salgueiros, por valor inferior a 500 euros?", o mais
certo surgirem inmeros sites com referncias dispersas acada um dos parmetros, mas nenhum site que os relacioneentre si, devolvendo-nos todos os resultados que contenhamas expresses "apartamentos T2, Plo universitrio, ou Sal-gueiros". No futuro, o objectivo que a pesquisa apenas de-volva, de facto, a informao acerca dos apartamentos querenam todas as condies especificadas e com validadetemporal.
Fonte: Wintech
Txis do Porto abrem caminho ao autom-vel do futuro
A tecnologia necessria a mais este avano da indstria au-tomvel est a ser estudada em vrios institutos e tambm nacidade do Porto, onde os 448 txis da cooperativa Raditxisesto j equipados com um dispositivo experimental desen-volvido em parceria pelas faculdades de Cincias e de Enge-
nharia da Universidade do Porto, pela Universidade de Aveiro,pela Carnegie Mellon University, dos EUA, e pelas empresasNDrive e Geolink.
Fonte: Pblico /local
Mozilla prepara sistema operativo mvelbaseado na Web
A Mozilla est a trabalhar no desenvolvimento de um sistemaoperativo aberto e baseado na Web, revelou ontem fonte dafundao, num grupo de discusso para programadores quecolaboram com a criadora do Browser Firefox. O projecto a que a Mozilla chama "Boot to Gecko" tem porbase o motor de renderizao Gecko, usado no browser Fire-fox e no cliente de email Thunderbird e dirige-se, numa pri-meira fase, a dispositivos mveis, como os smartphones etablets. O objectivo criar "um sistema operativo completo eindependente para uma Web aberta", rompendo com o"estrangulamento levado a cabo pelas tecnologias propriet-
rias no mundo dos dispositivos mveis", afirma Andread Gal,um dos investigadores da Mozilla, alertando para o facto des-te ainda se encontrar numa fase muito inicial."Algumas das suas componentes ainda esto apenas nasnossas cabeas, outras ainda no foram totalmente explora-das. Estamos a falar disto agora porque queremos contar comos conhecimentos de todos na Mozilla - e das pessoas queainda no fazem parte da Mozilla - para ajudarem a dar formae construir o projecto que estamos a preparar", explica.Parte do Boot to Gecko - cujo cdigo ser disponibilizado "emtempo real" medida que forem feitos avanos - baseadono sistema operativo mvel da Google, mas apenas no querespeita ao kernel (ou ncleo) e aos drivers, uma opo quelhe assegura compatibilidade com os dispositivos Android. O desenvolvimento dever primeiro passar por criar uma pla-taforma com capacidade para desempenhar as funes bsi-cas de um dispositivo mvel (chamadas, SMS, cmara, USB,Bluetooth) e APIs para lidar com elas. O objectivo passa de-pois por encontrar uma forma de as pginas Web e aplica-es acederem de forma segura aos componentes de queprecisem, possibilitando assim a criao de aplicaes nativasque corram directamente a partir da Web em vez de estaremdisponveis em apenas alguns dispositivos.
Quem quiser ficar com uma ideia do que esperar, poder ima-ginar, numa fase inicial, qualquer coisa como um smartphonecom o Firefox para Android como ecr inicial, com algumasAPIs personalizadas.
Fonte: Sapo.pt
Microsoft lana Platform Preview 2 doInternet Explorer 10
A Microsoft lanou esta semana a Platform Preview 2 do In-ternet Explorer 10. Segundo revelado pela empresa Norte-Americana, esta nova verso "Preview" apresenta o suporte aHTML5 Parser, HTML5 Sandbox, Web Workers, HTML5Forms, Media Query Listerners entre muitas outras novidades.Para alm destas caractersticas, existem tambm melhoriasno desempenho na abertura e apresentao de paginas web.Como sabido, a verso final Internet Explorer 10 no possuiainda uma data de lanamento, no entanto especula-se que averso Beta deve chegar em Setembro, altura em que dever
ser revelada tambm a verso Beta do Windows 8.O Internet Explorer 10 Platform Preview 2 apenas compat-vel com o Windows 7 (x86 e x64).
Fonte: Wintech
-
8/3/2019 Revista_PROGRAMAR_30
5/90
5
A integrao do Eclipse com ferramentas de desenvolvimen-to populares tambm foi melhorada no lanamento Indigo.Sobretudo, EGit 1.0 foi lanado como parte do ambiente pa-
dro do Eclipse, trazendo o muito necessrio suporte fora -da-caixa para o popular sistema de controlo da verso distribu-da de git. O EGit construdo em cima da biblioteca JGit, aqual providencia uma implementao Java nativa da funcio-nalidade de cliente git. Para alm do suporte git includo, oIndigo tambm oferece uma interaco estreita com a ferra-menta de gesto do projecto Maven atravs do novo projectom2e.
O Eclipse Indigo est disponvel para download a partir dosite oficial Eclipse. O Eclipse vem com muitos sabores existem vrios pacotes para download com diferentes confi-guraes e componentes. Obviamente, pode utilizar o cliente
Eclipse Marketplace includo para instalar componentes adi-cionais independentemente de qual pacote inicial for utiliza-do. Testmos o pacote padro de desenvolvimento Java emMac OS X e conclumos que funciona como esperado.
Para mais informaes sobre o lanamento, pode aceder aoanncio oficial do micro-site Indigo. A Fundao Eclipse esta fazer alguma angariao de fundos a par da actualizao.Se quer ajudar a fundao a atingir o seu objectivo de recru-tar 500 novos Amigos de Eclipse, pode aceder pgina 500Indigo.
Fonte: http://arstechnica.com/open-source/news/2011/06/
eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.ars
(Traduo: Sara Santos)
Eclipse Indigo lanado com a ferramentaWindowBuilder GUI e EGit 1.0
A Fundao Eclipse anunciou o lanamento do Eclipse 3.7,nome de cdigo Indigo. A verso mais recente do popularambiente de desenvolvimento integrado (IDE) open-sourceintroduz alguns novos componentes e funcionalidade melho-rada.
O design modular do Eclipse e nfase na extensibilidade aju-daram a atrair um largo ecossistema em volta do software. construdo e mantido como uma plataforma de ferramentasem vez de ser apenas uma aplicao que funciona sozinha.Uma grande quantidade de funcionalidade especializada est
implementada em plug-
ins, permitindo ao IDE integrar-
se commuitas ferramentas e suportar uma larga abrangncia de lin-guagens de programao e kits de ferramentas de desenvolvi-mento.
Os componentes do ncleo do IDE e muitos dos plug-ins sodesenvolvidos como projectos de open-source individuaisdentro da comunidade Eclipse. A Fundao Eclipse organizaum exerccio de lanamento anual o qual envolve um lana-mento coordenada a larga escala que abrange o ecossistemaEclipse. De acordo com estatsticas publicadas pela fundao,62 projectos Eclipse participaram no exerccio de lanamento.O lanamento consiste em aproximadamente 46 milhes de
linhas de cdigo de 408 programadores individuais.
Devido ao alcance prodigioso de um lanamento Eclipse, possvel realar todas as alteraes e melhoramentos. Exis-tem contudo, um nmero significativo de acrscimos que sodignos de nota.
O projecto mais significativo no lanamento Indigo o Win-dowBuilder, uma ferramenta sofisticada para construir interfa-ces grficos de utilizador com SWT e Swing. O WindowBuil-der era anteriormente uma ferramenta comercial desenvolvidapela Instantations, mas foi adquirida pela Google no ano pas-sado. A Google libertou o cdigo fonte e deu-o como contri-
buio Fundao Eclipse para que pudesse ser incorporadono IDE como a ferramenta padro de design do interface doutilizador. A Google tem continuado a desenvolver activamen-te o projecto desde que libertou o cdigo fonte.
O WindowBuilder suporta o tipo de design visual de interfacedrag-and-drop que os programadores tm vindo a esperar dosambientes modernos de desenvolvimento. Possui uma carac-terstica de gerao de cdigo bi-direccional inteligente quelhe permite interagir com cdigo de interface de utilizador edi-tado manualmente. Tendo esta caracterstica includa no IDEpor predefinio um grande ganho para programadores Ja-va que criam aplicaes grficas.
http://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.arshttp://arstechnica.com/open-source/news/2011/06/eclipse-indigo-released-with-windowbuilder-gui-tool-and-egit-10.ars -
8/3/2019 Revista_PROGRAMAR_30
6/90
-
8/3/2019 Revista_PROGRAMAR_30
7/90
7
Introduo
O que esperar deste artigo?
Este artigo pretende servir como introduo construo dewebsites recorrendo tecnologia RubyOnRails. Como facil-mente se entende, no possvel transmitir todos os porme-nores inerentes a um processo desta complexidade num sartigo. Como tal, sero abordados alguns aspectos importan-tes, que permitiro a algum com total inexperincia comesta tecnologia, construir uma aplicao web simples comacesso a uma base de dados.
Durante o artigo, e como os aspectos so focados de umaforma muito superficial, existem ligaes para que os temasanalisados possam ser estudados e compreendidos commaior profundidade. No final do artigo encontram-se tambmalgumas ligaes teis, bem como o local para descarregar ocdigo da aplicao que vai ser construda ao longo do arti-go.
O que isto do Ruby on Rails e porque que me devopreocupar em conhecer esta tecnologia?
RoR, muitas vezes abreviado simplesmente para Rails defacto um conjunto composto por vrias tecnologias, de ondese destacam duas: Ruby e Rails. Vamos ver mais frente ecom maior detalhe o que cada uma das partes.
Por agora, vamos apenas considerar o RoR simplesmente
como uma plataforma ou tecnologia de desenvolvimentoweb.
Existem vrias tecnologias de desenvolvimento web, umasmais conhecidas, como o PHP, ASP clssico, ASP.NET,JSP, e outras em fase de expanso e ainda no to di-fundidas (embora esta tendncia esteja claramente mudan-a), como o caso do RoR.
Ok, ento o RoR uma plataforma de desenvolvimento web,mas h muitas outras, porque que me devo interessar emaprender RoR?
Os motivos so inmeros, por isso vamos apenas focar al-guns que fazem parte de um conjunto bem maior, mas queajudam a perceber que tipo de plataforma de desenvolvi-mento temos nossa frente. No final, o facto de gostarmos
ou no desta plataforma acaba tambm por se reflectir naforma que temos de organizar o nosso trabalho. Vejamosento alguns dos factores que tornam esta tecnologia toapetecvel:
uma tecnologia livre O facto de no estar depen-
dente de terceiros (leia-
se empresas e tecnologias propri-etrias), para muitos uma vantagem e um factor pre-ponderante na escolha da tecnologia;
Utiliza a linguagem de programao Ruby - Ruby como uma certa bebida que por a anda: primeiro estra-nha-se, e depois entranha-se. Para quem nunca progra-mou em Ruby, a sintaxe pode parecer muito estranha,parecendo que, por vezes, se est a escrever em inglsem vez de programar. Outras vezes parece que estamosa pensar da forma inversa ao que fazemos ao programarem outras linguagens. Depois de algum tempo a progra-mar em Ruby, apercebemo-nos da elegncia da lingua-
gem e com o tempo e o acumular de experincia torna-seum forte aliado.
Tem uma comunidade grande e activa - extrema-mente simples obter ajuda nas vrias comunidades exis-tentes (tambm em Portugal: ver fim do artigo), e a maiorparte das vezes algum j teve o mesmo erro/problemacom que nos deparamos.
Arquitectura Out-of-the-box - Quem que nunca sesentiu frustrado ao iniciar a construo de uma aplica-o web ou website? H tanto para fazer que difcilsaber onde comear. Com RoR, ao ser criada uma novaaplicao, a arquitectura est definida, bastando acres-centar os ingredientes.
Sistema de templating robusto e verstil - No s
-
8/3/2019 Revista_PROGRAMAR_30
8/90
8
permite a renderizao de pginas web, mas tambmXML, JSON e at mensagens de email de uma formasimples e prtica.
Active Record - Uma ferramenta de Object RelationshipMapping (ORM) perfeitamente integrada na plataforma,que permite, entre outras coisas, que a base de dadosseja gerada a partir do modelo de dados da aplicao, eliberta o programador da tarefa de escrever SQL.
Convention over Configuration - Este pode parecer umponto controverso, pois se por um lado o facto de grandeparte das definies estarem perfeitamente definidas porconveno, pode parecer no existe um controlo toapertado da forma como as coisas vo acontecer. Talno se verifica, pois apesar de as convenes existirem
para facilitar a tarefa dos Developers, podem ser facil-mente substitudas, alteradas e redefinidas, adaptando aplataforma s necessidades de cada Developer e de ca-da situao.
Instalao
Antes de continuarmos, vamos proceder instalao daplataforma. Desta forma alguns dos pequenos exemplos decdigo podero ser testados medida que o artigo se vai
desenvolvendo. Actualmente a plataforma mais utilizadapara desenvolver RoR Mac OS X, mas vamos demonstrara instalao em Windows, dado que este ser (em princpio)o sistema utilizado pela maioria dos leitores. Contudo ficamtambm ligaes para os stios onde se podero encontrarinformao sobre a instalao desta plataforma em Mac eem Linux.
Instalao em Windows
A plataforma RoR constituda por vrias tecnologias, no-meadamente:
Ruby
Rails
GIT
SQLite
Uma das abordagens seria instalar isoladamente estes itens,mas existe uma forma de instalar tudo isto (e mais ainda) deuma vez s, em Windows.
Essa ferramenta chama-se Rails Installer:
http://railsinstaller.org
Basta escolher a opo Download the Kit e correr o execu-tvel que descarregado.
A instalao simples. Devemos apenas ter em ateno aopo que adiciona os executveis do Ruby, GIT e DevKit aoPath, para que mais tarde possamos cham-los a partir dalinha de comandos.
De seguida ser pedido o nome e endereo de email do utili-zador.
Estes dados servem para configurao do GIT (ver edioanterior da Revista) de modo a que possam utilizar reposit-rios GIT como por exemplo o GitHub (https://github.com).
Atravs do menu iniciar temos acesso a uma linha de co-
mandos carregada com o PATH dos executveis necess-rios ao funcionamento da plataforma:
Introduo ao Ruby on Rails
http://railsinstaller.org/http://railsinstaller.org/https://github.com/https://github.com/https://github.com/http://railsinstaller.org/ -
8/3/2019 Revista_PROGRAMAR_30
9/90
9
Um dos comandos que interessa reter para j o irb. Estecomando, disponvel na Prompt carregada com as ferramen-tas do RoR, abre uma consola de Ruby, onde podemos tes-tar alguns dos exemplos que se seguem.
Nota: tanto em Mac como em Linux, necessrio instalartodos os elementos de forma separada, dado que at datano existe um mtodo de instalao que englobe todos oselementos necessrios.
Instalao em Mac
http://pragmaticstudio.com/blog/2010/9/23/install-rails-ruby-mac
http://www.buildingwebapps.com/articles/79197-setting-up-rails-on-leopard-mac
Instalao em Linux (Ubuntu)
http://www.ubuntugeek.com/how-to-install-ruby-on-rails-ror-in
-ubuntu.html
Introduo ao Ruby
De uma forma simples e rpida, Ruby uma linguagem deprogramao orientada por objectos, interpretada, fortemen-te tipada e ao mesmo tempo dinmica, com gestoautomtica de memria. Surgiu no Japo em 1995, pelasmos de Yukihiro Matsumoto (tambm conhecido comoMatz).
Existem, hoje em dia, vrias tecnologias e linguagens basea-das em Ruby, como o JRuby, IronRuby, HotRuby, etc.
A linguagem ganhou alguma notoriedade com o aparecimen-to da Framework Rails em 2003/2004.
Algumas caractersticas do Ruby:
- Todas as variveis so consideradas objectos
- Todos os tipos primitivos (inteiros, decimais) so classes
- Tudo verdadeiro (true) excepto false e nil (equivalente aonull de outras linguagens)
- Garbage Collection automtico
A sintaxe muito elegante e permite fazer cdigo simples efcil de ler como este:
A instruo unless funciona um pouco como o if, mas coma lgica invertida.
Podemos ler a instruo anterior da seguinte forma: a vari-vel maioridade toma o valor Maior de idade a menos que aidade seja inferior a 18. Simples :)
Este o exemplo mais simples de um loop. A facilidade comque se pode ler permite que, mesmo que nunca se tenhavisto Ruby, se perceba facilmente o que este pedao de c-digo faz. Repare-se que o nmero inteiro 3, consideradoum objecto como qualquer outro, que tem mtodos que po-dem ser invocados, como neste caso, o mtodo times.
Temos ento, que o bloco de cdigo ( que termina no end) executado 3 vezes, tal como pode ser literalmente lido,quase como se fosse em ingls. Vamos ver com maior deta-lhe os loops um pouco mais frente.
Neste exemplo vemos a utilizao do ponto de interrogao
maioridade =Maior de idade unless idade
-
8/3/2019 Revista_PROGRAMAR_30
10/90
10
na sintaxe. Para que este snippet funcione, a classe do ob-jecto pessoa tem de ter definido o mtodo registada?. Tipi-camente mtodos terminados em ? so mtodos que de-
volve valores booleanos. Para quem tem experincia emJava ou.NET basta pensar nestes mtodos como os mto-dos comeados por Is (ex: boolean IsRegistada()) que tipi-camente devolvem resultados booleanos.
Em Ruby todos os tipos de dados so classes. Vamos ape-nas abordar algumas das classes mais utilizadas, pois seriaimpossvel abord-las a todas.
O resto da API pode ser consultada aqui: http://www.ruby-
doc.org/core/
Numeric
Como facilmente se depreende pelo nome, esta classe, re-presenta valores numricos. Existem classes derivadas des-
ta, como a Float, a Integer ou a BigNum. Tipicamente iroser utilizadas as classes Double e Integer.
Um texto pode ser transformado em inteiro com o mtodo
to_i e um nmero pode ser transformado em string (texto)
com o mtodo to_s.
Ex:
Referncia:http://www.ruby-doc.org/core/classes/Float.htmlhttp://www.ruby-doc.org/core/classes/Integer.html
Strings
Como se depreende pelo nome, esta classe representa ob- jectos de texto. Uma string pode delimitar-se com aspas ()ou plicas (). O operador de concatenao composto pordois sinais de menor (
-
8/3/2019 Revista_PROGRAMAR_30
11/90
11
Ex:
Resultado: 1
Referncia:http://www.ruby-doc.org/core/classes/Hash.html
Symbol
Este ser talvez um dos conceitos mais difceis de entender
e de explicar, pois no tem um paralelo directo em outraslinguagens.
Um smbolo serve para representar nomes e textos pe-rante o interpretador de Ruby. Um smbolo sempre cons-tante num determinado contexto, no entanto pode represen-tar num certo contexto uma classe, em outro contexto ummtodo, e ainda num terceiro contexto diferente uma vari-vel, mas ser sempre o mesmo objecto, da classe Symbol.
A definio de um objecto do tipo Symbol em Ruby tem sidoalvo de discusses, mas parece que a definio resultanteindica que um smbolo deve ser usado sempre que neces-srio referenciar um nome (identificador, palavra-chave)mesmo que estejamos a falar de algo que no existe aindano nosso cdigo. Confuso? Sim, concordo. Contudo com autilizao de smbolos, o seu propsito vai ficando mais claroe torna-se at intuitivo.
Um smbolo define-se colocando dois pontos (:) antes do seunome. Os Smbolos so frequentemente usados como cha-
ves em hashes.
Referncia:http://www.ruby-doc.org/core/classes/Symbol.html
Definio de Classes e mtodos
Uma classe define-se da seguinte forma:
Como possvel ver, o cardinal (#) define um comentrio deuma linha.
Vamos ento acrescentar um mtodo a esta classe que re-ceba dois parmetros e que devolva a sua soma (assumindoque so nmeros):
Um mtodo define-
se com a palavra def. A ltima instruode um mtodo considerada o seu retorno, mas pode -seusar tambm a palavra return para melhor legibilidade.
A herana entre classes faz-se utilizando o operador menor( 1,"c"=> 2 }
puts hash[a]
class NomeDaClasse
#corpo da classe
end
def soma (a,b)
a+b
end
class Automovel < Veiculo
end
while condicaodo
#instrues
end
instrucaowhile condicao
Introduo ao Ruby on Rails
http://www.ruby-doc.org/core/classes/Hash.htmlhttp://www.ruby-doc.org/core/classes/Hash.htmlhttp://www.ruby-doc.org/core/classes/Hash.htmlhttp://www.ruby-doc.org/core/classes/Hash.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Hash.html -
8/3/2019 Revista_PROGRAMAR_30
12/90
12
Until
For
O ciclo for pode ser utilizado com intervalos ou com colec-es de elementos (arrays, hashes). Um intervalo define-seda utilizando entre o valor inicial e final dois pontos seguidos
(..) :1..10 ( 1 ponto ponto 10) - Especifica um intervalo de 1 a 10(inclusive).
Ex:
Each
Basicamente o mtodo each, percorrer todos os elementosda coleco e executa o cdigo contido dentro do bloco.Quem utiliza o foreach em outras linguagens est certamen-te a notar que falta algo.
Como que referenciamos o elemento actual dentro dobloco? Mais do que referenciar, temos de passar para den-tro do bloco o item actual. Para isso, rodeamos por barras
verticais ou pipes ( | ) o nome pelo qual queremos referenciaro objecto dentro do bloco.
Uma forma engraada de olhar para esta notao, tal como possvel ler no livro Why's (poignant) Guide to Ruby, que podemos olhar para estas barras verticais como uma
pequena porta, por onde o valor entra para dentro do blocode cdigo.
Ex:
Resultado:
123
Extensibilidade
Imagine-se que necessitamos de estender a classe Integer
e adicionar um mtodo que diga se um nmero positivo ouno. Vejamos ento como faze-lo:
To simples como isto. Este tipo de alterao/acrescento defuncionalidades em runtime designa-se de Monkey Patching.
Em outras linguagens (no dinmicas) este tipo de aborda-gem iria gerar um erro de Classe Duplicada, e a soluoseria estender a classe, criando uma nova classe que her-dasse da classe integer e criar os novos mtodos ou fazeroverride dos mtodos j existentes na classe base.
Neste caso o mtodo positivo? ser um aumento da clas-
se Integer, e passar a fazer parte da classe.
Como possvel ver, a palavra self diz respeito ao prprio
until condicaodo
#instrues
end
for i in 1..10do
#instrues
end
for i in[1,3,5,6,8]do
#instrucoes
end
coleccao.eachdo
#instrucoes
end
coleccao = Array.new(1,2,3)
coleccao.eachdo| item_actual |
puts item_actual
end
class Integer
def positivo?
self>0
end
end
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
13/90
13
objecto em si (o bem conhecido this do Java, C# e PHP).
Ruby Gems
Uma gem no nada mais, nada menos do que uma biblio-teca ou programa empacotado. Todas as gems tm um no-me e uma verso. Pode ser feito um paralelismo com osficheiros .dll no .NET ou os .jar no Java, embora existamdiferenas.
As Gems podem ser instaladas de forma fcil, bastando paraisso existir uma ligao internet. A sua instalao funciona
atravs de repositrios, de onde so descarregadas e insta-ladas.
Ao instalar o rails no Linux ou em Mac, foi necessrio, a cer-ta altura, executar este comando:
gem install rails
Este o comando para instalao de novas gems. A gem trazida do repositrio e instalada.
possvel ver as Gems instaladas atravs do comando:
gem list
possvel criamos as nossas prprias gems e at submet-las para o repositrio, para que outros as possam utilizar.
Mais informao sobre as RubyGems:
http://rubygems.org/
http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/
Overview do MVC
Antes de passarmos anlise da framework Rails, que ser-ve, juntamente com o Ruby, de base a esta tecnologia, va-mos ver (ou rever, caso seja j um conceito familiar) como
funciona uma aplicao MVC, dado que a framework funcio-na com base neste padro.
A Sigla MVC deriva de Model-View-Controller. O MVC umpadro de desenho (design pattern) utilizado na criao deaplicaes informticas. Uma das principais preocupaes
do MVC a separao de responsabilidades (muitas vezesreferida nos livros e pela comunidade por Separation Of Con-cerns, ou simplesmente SoC).
Existem, assim, trs partes distintas do projecto, cada umacom responsabilidades prprias, e que interligadas permitemno s o funcionamento eficaz dos projectos, mas tambmfacilitam de uma forma muito eficaz a manuteno dos pro-
jectos.
O Model, muitas vezes chamado de Domain visa representaro modelo de dados do projecto. tambm aqui grande parteda lgica deve residir, de modo enriquecer o modelo de da-dos. tambm o Model o responsvel pela persistncia dedados. Muitas vezes so utilizadas ferramentas de ORMacopladas ao Model, de modo a facilitar esta tarefa: NHiber-nate, Entity Framework, Hibernate, e o ORM que nos vaiinteressar particularmente: Active Record.
Um Controller um ponto de interaco do utilizador com aaplicao. Um controlador constitudo por aces (Actions)
e cada aco representa um mtodo. o controlador o res-ponsvel por validar dados e por fazer as chamadas neces-srias ao Model de modo a passar-lhe dados ou simples-mente, a traz-los para a aplicao. Um controlador invocaas Views de modo a poder apresentar os dados ao utilizador.
Uma View a representao visual da aplicao. Pode rece-ber dados do Controller, e pode at ser uma representaovisual do Model. sempre invocada por uma Action dentrode um Controller. aqui que reside a parte visual da aplica-o.
Como possvel perceber a partir da explicao anterior,existe uma total separao de conceitos, sendo que poss-vel alterar a interface da aplicao (alterando as Views) semque o resto da aplicao sofra qualquer alterao. Da mes-ma forma, se existirem alteraes nas regras do negcio,ser o Model (e possivelmente tambm os Controllers) asofrerem alteraes, mas as Views manter-se-o intactas,deixando a interface intacta. Se for necessrio alterar a for-ma de persistncia (por exemplo, trocar de motor de base dedados), ser a parte de persistncia do Model a nica sec-o do projecto a sofrer alteraes. Esta tarefa fica aindamais simplificada se for utilizado um ORM com suporte amltiplos motores de base de dados.
Introduo ao Ruby on Rails
http://rubygems.org/http://rubygems.org/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://sirupsen.com/create-your-first-ruby-gem-and-release-it-to-gemcutter/http://rubygems.org/ -
8/3/2019 Revista_PROGRAMAR_30
14/90
14
Fica um vdeo engraado que ajuda a perceber a vantagemda organizao MVC:
http://www.youtube.com/watch?v=p5EIrSM8dCA
Como funciona ento o MVC?
O MVC funciona atravs de rotas. Mas o que uma rota?
Com uma tecnologia de desenvolvimento web convencional(e por convencional leia-se, no MVC), o urlwww.dominio.com/pasta/ficheiro.extensao leva-nos at umficheiro chamado ficheiro.estensao, que se encontra real-mente dentro de uma directoria chamada pasta, no servidor
indicado por aquele endereo. Em MVC isto no aconteceassim. Os caminhos so virtuais e so resolvidos pelo com-ponente de gesto de rotas da plataforma. Em Rails e emgrande parte das Frameworks MVC, a rota padro : Dom-nio/Controller/Action/Id, tambm representado por /Controller/Action/Id.
Exemplo: www.dominio.com/Clientes/Detalhes/10
Como se deve ler url moda do MVC?
Fazendo o paralelismo com o mapeamento acima, facilmen-te se percebe o seguinte:
Controller: ClientesAction: DetalhesId: 10
Ento temos que estamos a invocar a aco Detalhes, que um mtodo do Controlador Clientes e estamos a passar-lhe o id 10.
O que esta Action provavelmente faz aceder ao Model etrazer os dados do cliente com o id 10. Depois deve passaros dados, devidamente formatados, para uma View, que invocada pela Action.
No existe, necessariamente, nenhuma pasta chamadaclientes, ou detalhes, nem um ficheiro com nome 10,mas sim uma rota que capaz de pegar num url e de otransformar numa chamada a um mtodo (Action) de umaclasse (Controller) passando-lhe um (ou mais) parmetros.
Este tipo de urls permite uma transposio directa da estru-tura dos mtodos (pblicos) dos controllers, o que faz com
que seja muito utilizada com webservices RESTfull.
ainda possvel criar rotas personalizadas, de modo imple-mentar prticas SEO, mas no sero abordadas neste artigo.
Passemos ento ao Rails, enquanto Framework e plataformade desenvolvimento web.
Quickstart Rails
Como j foi referido anteriormente, Ruby On Rails constitu-do (entre outras coisas) por Ruby (a linguagem) e Rails (aFramework).
A framework - actualmente na verso 3.0 - surgiu em 2004pelas mos de David Heinemeier Hansson ( http://david.heinemeierhansson.com/ ).
Utiliza o padro MVC e disponibiliza, out-of-the-box, funcio-nalidades como scaffolding (abordado mais frente), umORM (Active Record), um servidor web (webBrick), entreoutras funcionalidades e ferramentas, que permitem aosdevelopers criarem, de uma forma rpida, aplicaes web.
Baseia-se em duas filosofias de funcionamento:
Conveno sobre a Configurao (Convention overconfiguration) onde se assume um conjunto de conven-es (algumas so abordadas de seguida) de forma aque o developer no tenha de se preocupar com a confi-gurao de aspectos que, na maioria das vezes, so con-figurados sempre da mesma forma. Por exemplo, se exis-te uma classe no Model chamada User, muito prov-vel que a tabela na base de dados se v chamar Users.
E de facto esta a tabela utilizada pelo Active Record,por conveno, para esta classe. Podemos sempre ultra-passar as convenes e configurar o que for necessrio,pois Convention over Configuration no significaConvention instead of Configuration.
DRY Significa Dont Repeat Yourself, mas tambm po-de ser lido na forma literal, como cdigo seco. CdigoSeco (dry code) significa a arquitectura est to bem es-truturada que no existe repetio de cdigo. A repetiode cdigo leva a que por vezes um bug seja repetido coma replicao do cdigo, o que torna a sua correco maisdifcil, e por vezes corrigido num local e permanece em
outro. Ao evitar a repetio de cdigo (princpio DRY),toda a aplicao se torna mais legvel, fcil de gerir e demodificar.
Introduo ao Ruby on Rails
http://www.youtube.com/watch?v=p5EIrSM8dCAhttp://www.youtube.com/watch?v=p5EIrSM8dCAhttp://www.youtube.com/watch?v=p5EIrSM8dCA -
8/3/2019 Revista_PROGRAMAR_30
15/90
15
Convenes
De acordo com o que referido atrs, a Framework Rails utili-za uma filosofia de Convention over Configuration. Por estarazo importante conhecermos algumas das convenes(tambm conhecidas como sensible defaults), de modo aque melhor se possa perceber o comportamento da platafor-ma.
Existem diferentes tipos de convenes, e seria impossvelabord-las todas aqui. No entanto ficam algumas das maisimportantes para a fase de introduo plataforma:
Base de Dados:
nomes de tabelas sempre no plural. Ex: customers, paraa classe Customer
chave primria o campo id
chave estrangeira constituda pelo nome da entidade,
seguida por underscore e id. Ex: customer_id
Model:
Modelos com mais do que uma palavra usam Pascal Caseno nome da classe, e undescore a separar as palavras (quedevem utilizar apenas letras minsculas) no nome do fichei-ro. Ex:
Nome da classe: CustomerOrder
Nome do ficheiro: customer_order.rb
Existem bastantes mais convenes. Algumas sero aindaabordadas durante a parte prtica do artigo, que pode servista de seguida.
Criao de uma aplicao em RoR
A criao de uma aplicao em Ruby on Rails implica umuso constante da linha de comandos. Para quem est habi-tuado a que o IDE d uma ajuda nas tarefas de desenvolvi-mento, este paradigma pode parecer um pouco contra-natura. Contudo, e como em muitas outras situaes, acabapor se tornar usual e bastante prtica.
Tarefas como criar uma nova aplicao Rails, adicionar umaentidade ao Model, criar um novo Controller, criar umScaffold (abordado de seguida) ou at iniciar e parar o servi-dor, implicam o uso da linha de comandos, e implicam tam-bm o conhecimento de comandos especficos, com uma
sintaxe prpria.
Nota: existem IDEs que abstraem o developer da utilizaoda linha de comandos, facultando interfaces grficas mas
que no fundo vo chamar os comandos que teriam de serexecutados na consola.
A aplicao que ser construda de seguida, como forma dedemonstrao da tecnologia, ser construda apenas comum editor de texto e com a linha de comandos, sem recursoa qualquer IDE, de forma a que possa ser demonstrado, deuma forma mais limpa, o processo de criao. No dia -a-dia, de todo, aconselhvel a utilizao de um IDE, com auto-completion e syntax highlighting.
Aptana Studio 3 (grtis) http://www.aptana.com/
RubyMine ( Grtis para projectos OpenSource) - http://www.jetbrains.com/ruby/
Passemos ento criao da aplicao. O primeiro passo definir o local onde a aplicao ser armazenada. Nestecaso a aplicao ir ficar na directoria C:\Sites. De seguida necessrio abrir a linha de comandos.
Uma vez dentro da directoria desejada, o comando respon-
svel pela criao da aplicao o comando:
rails new nome_da_aplicacao
Uma vez executado este comando, sero criados vrios fi-cheiros e pastas dentro de uma pasta com o nome da aplica-o. Neste caso vamos dar o nome lista_de_compras nossa aplicao:
rails new lista_de_compras
Aps a execuo deste comando, possvel ver que o scriptcolocou algumas mensagens na consola, indicando a cria-o dos ficheiros e pastas da aplicao.
Introduo ao Ruby on Rails
http://www.aptana.com/http://www.aptana.com/http://www.jetbrains.com/ruby/http://www.jetbrains.com/ruby/http://www.jetbrains.com/ruby/http://www.jetbrains.com/ruby/http://www.jetbrains.com/ruby/http://www.aptana.com/ -
8/3/2019 Revista_PROGRAMAR_30
16/90
16
Abrindo a pasta com o nome da aplicao, podemos obser-var e analisar os ficheiros e pastas que foram utilizados:
Vamos ento ver o que cada directoria e ficheiros significame qual o seu propsito.
Pasta App: aqui que a aplicao reside. Todos os con-
trollers, views, models, helpers residem aqui dentro. Fala-remos dela mais frente medida que construmos aaplicao.
Pasta Config: Como o prprio nome indica aqui que
residem as configuraes da nossa aplicao. Iremostambm abordar alguns ficheiros contidos nesta pasta deseguida.
Pasta Db: Tipicamente uma aplicao Rails vai utilizar
uma base de dados relacional. aqui que ficam osscripts de migrao/criao da base de dados, e no casode a base de dados ser no formato de ficheiro, o ficheiroda base de dados ficar tambm aqui.
Pasta Doc: Existe uma Framework chamada RubyDocque permite gerar documentao a partir do nosso cdi-go. aqui que a documentao fica armazenada.
Pasta Lib: onde as bibliotecas sero adicionadas(excepto os plugins/bibliotecas proprietrias, que sero
armazenadas na pasta Vendor).
Pasta Log: aqui que as mensagens de Log sero guar-
dadas.
Pasta Public: Este o local onde so guardadas as ima-
gens, folhas de estilo (CSS) e scripts client-side(Javascript), bem como todas as pginas estticas parti-lhadas pela aplicao: pgina 404 (not found), etc.
Pasta Script: onde reside o script responsvel pela ge-rao de itens (views, models, controllers, etc). Estescript apenas chama outros scripts/executveis, no sen-
do ele o verdadeiro responsvel pela gerao/destruiodos elementos.
Pasta Test: A Framework anda de mo dada com Test
Driven Development, o que significa que a criao detestes unitrios encorajada. aqui que ficam os testes,bem como os dados fictcios (Mock).
Pasta tmp: Pasta utilizada pelo Rails para armazenamen-
to temporrio, auxiliar ao processamento.
Ficheiro .gitignore: Este ficheiro no est directamente
relacionado com o Rails, mas sim com o GIT. Quando
utilizamos um repositrio de cdigo existem certos fichei-ros que no interessa enviar e guardar: ficheiros tempo-rrios, ficheiros gerados/compilados (no acontece aqui,pois Ruby interpretado), entre outros. O fichei-ro .gitignore indica quais os ficheiros / tipos de ficheiro
devem ser ignorados nos commitse pushs do GIT. Para mais deta-lhes, ver o artigo sobre GIT, na
edio anterior da revista. Ficheiro config.ru: Juntamente com
os ficheiros contidos na pasta con-fig, este ficheiro utilizado na confi-gurao da aplicao.
Ficheiro Gemfile: aqui que so
definidas as RubyGems utilizadaspela aplicao. Por exemplo, se aaplicao utiliza uma base de da-dos MySQL, necessrio adicionara Gem do MySQL, para que o Rails
consiga comunicar com o MySQL.
Ficheiro Rakefile: Semelhante ao
Makefile usado em Unix/C. oficheiro que contm informaessobre o empacotamento da apli-cao. consumido pelo utilitriorake, que vem contido na instala-o.
Terminada a anlise estrutura da pasta da aplicao, altura de iniciar o servidor e ver pela primeira vez a aplicaoa correr. Para tal basta executar o comando:
rails server
Nota: este comando ter de ser executado dentro da pastada aplicao, caso contrrio no ser iniciado o servidor.
Para terminar o servidor, basta utilizar a combinao de te-clas Ctrl+C.
Como possvel ver, o servidor webBrick iniciado na porta3000. Se quisermos utilizar a porta padro para um servidorweb (porta 80), basta adicionar -p 80 ao comando:
rails server p 80
Nota: Ser esta a porta usada durante o resto do artigo.
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
17/90
17
Desta forma podemos aceder nossa aplicao, simples-mente colocando o endereo http://localhost no browser:
possvel ver o ambiente da aplicao, clicando na ligaoAbout your applications environment. Aqui podemos confe-rir a verso dos elementos do nosso ambiente, bem comosaber qual dos ambientes est actualmente activo (abordadocom maior detalhe mais frente).
Ainda na pgina possvel ver 3 passos para que a aplica-o comece a funcionar como deve ser.
1 Criar controllers e models com o comando rails genera-te2 Registar rotas3 Criar e configurar a base de dados
, agora, altura de definir o que a aplicao vai fazer: seruma aplicao bastante simples que ir permitir a criao devrias listas de compras. Cada lista de compras ter um no-me e uma prioridade. Uma lista poder ter vrios itens, sen-do que cada item ter um nome, um preo estimado e uma
quantidade.
O objectivo construir uma aplicao simples que permita acriao, alterao e remoo de listas de compras e dosseus itens. Ir ser utilizado o motor de base de dados SQLi-te, dado que vem com a instalao da Framework.
Vamos comear pela criao de um Controller chamadoInicio. A criao de controllers faz-se com o comando:
rails generate controller nome_do_controller
Ao correr este comando, so executadas vrias aces, dasquais interessa destacar a criao de um ficheiro dentro dapasta App/Controllers, que contm a classe do Controller.
tambm criada uma pasta com o mesmo nome dentro dapasta das Views (App/Views).
Por conveno, todas as views de um controller, devem es-tar dentro de uma pasta com o nome desse controller(estando esta pasta dentro da pasta views).
Vamos ento gerar o controller Inicio (se o servidor estiver
em execuo necessrio par-
lo):
rails generate controller inicio
Abrindo a pasta App/Controllers, possvel ver que foi criadoum ficheiro chamado inicio_controller.rb, que o ficheiroonde o controller est definido:
Este ficheiro contm uma classe chamada InicioController.Interessa relembrar a naming convention onde no nome dosficheiros as palavras so separadas por underscore(inicio_controller.rb) e no nome das classes/mdulos utili-zado Pascal Case (InicioController).
Esta classe estende (herda de) a classe ApplicationControl-ler.
Todos os controllers estendem esta classe, e por conveno,
o nome utilizado na criao sufixado pela palavraController, gerando assim o nome da classe.
Como vimos anteriormente, um controller tem mtodos, aosquais podemos chamar de Actions.
class InicioController < ApplicationControler
end
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
18/90
18
Vamos definir um mtodo vazio chamado ola:
Como vimos anteriormente, pelo padro do MVC, consegui-mos chegar a uma action utilizando o seguinte url: http://servidor/controller/action, logo ao abrir o url http://localhost/
inicio/ola devemos chegar a esta Action. Vamos iniciar oservidor e tentar abrir este url no browser.
Pois , no funciona. O erro diz-nos que no existe aindanenhuma rota definida que coincida com /inicio/ola.
Vamos ento definir a rota standard do MVC: /controller/action/id. Para isso, vamos at pasta config, dentro da pas-ta da aplicao, e vamos abrir o ficheiro routes.rb. Vamosalterar o ficheiro de modo a adicionar este mapeamento.Possivelmente a rota est comentada no fim do ficheiro, peloque basta descomentar (ou adicionar no caso de no existir)a seguinte linha:
necessrio reiniciar o servidor, de modo a que a nova rotatomada em conta. Abrindo o url anterior, agora o erro dife-rente:
O que aconteceu, que o controller inicio foi encontrado,a action ola tambm foi encontrada, e por conveno, estaAco tem uma Vista associada com o mesmo nome. Aindapor conveno, a vista estar dentro de uma pasta com o
mesmo nome do controller, dentro da pasta das Views
(neste caso o erro indica que esperava encontrar um ficheirochamado ola dentro da pasta views/inicio).
A View no criada automaticamente, nem existe um scriptgenerate para Views. Teremos, por isso, de a criar mo.
Uma view tem extenso .rhtml (ruby-html) e contm cdigoRuby e HTML. Uma vez que a Action se chama ola, a me-nos que indiquemos explicitamente na Action, que a Viewtem outro nome, o nome da View ser ola.rhtml.
Vamos ento criar um ficheiro vazio, chamado ola.rhtml,
dentro da pasta inicio, que se encontra dentro da pastaviews, dentro da pasta app:
Vamos agora abrir o ficheiro no editor de texto e adicionar aseguinte frase: Este texto foi escrito dentro da vista ola docontroller inicio.
Depois de guardar o ficheiro, vamos recarregar a pgina queantes estava a mostrar o erro, e dever ser possvel ver oseguinte:
J funciona :) !!
Vamos adicionar uma nova rota, de modo a que esta seja a
action e controller a ser chamados quando apenas se colocao endereo base (http://localhost) no browser (Rota de razou pr-definida).
class InicioController < ApplicationControler
def ola
end
end
ListaDeCompras::Application.routes.drawdo
match ':controller(/:action(/:id))'
end
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
19/90
19
Para isso vamos novamente abrir o ficheiro routes.rb, queest na pasta config.
Vamos alterar o comportamento da rota de raiz (root) que,por conveno, aponta para o ficheiro index.htm que estna pasta public, e que vimos quando abrimos a aplicaopela primeira vez.
Para que tal acontea vamos, primeiro, apagar ou renomearo ficheiro index.html, que est dentro da pasta public, poistem precedncia sobre a rota.
De seguida vamos modificar ligeiramente o ficheiro de rotas,passando para dentro do bloco de cdigo uma instncia do
objecto de gesto de rotas, e vamos adicionar o mapeamen-to da rota root:
Agora acedendo simplesmente a http://localhost, a Actionol do Controller inicio dever ser invocada.
Vamos agora analisar o cdigo fonte que foi gerado para apgina:
possvel ver que existe bem mais contedo do que aqueleque a nossa View contm. Isso deve-se existncia de umLayout ou Master Page. Um Layout uma pgina princi-
pal que fica volta das Views, englobando-a. no layoutque devem ser definidos os pontos comuns do website, demodo a que fiquem definidos num s local, evitando a repeti-o (princpio DRY), como menus, barras de topo/fundo, etc.
Onde est ento este layout?
Este layout encontra-se dentro da pasta layouts, que se en-contra dentro da pasta Views. Um layout tem a extenso.html.erb. Vamos abrir o ficheiro application.htm.erb noeditor de texto:
Antes de analisarmos o cdigo, vamos adicionar um textoantes da instruo yield, para que melhor se perceba comofunciona a interligao da View com o Layout.
ListaDeCompras::Application.routes.drawdo|map|
match ':controller(/:action(/:id))'
map.root :controller=>'inicio', :action =>'ola'
end
ListaCompras
Este texto foi escrito pela action ola do controller inicio
ListaCompras
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
20/90
20
Para dar algum nfase, vamos utilizar um H3:
Como possvel ver, tanto o texto que colocmos no layoutcomo o que est contido na View so mostrados.
Passemos ento anlise do cdigo do template (ficheirolayout.htm.rb). Podemos ver algum cdigo HTML (o mesmo
que havamos visto no cdigo fonte da pgina que abrimos pouco no browser) e algum cdigo Ruby (delimitado pelastags ).
Existem duas formas de inclur Ruby dentro de uma pgina,seja ela um layout ou uma view:
A forma com output
A forma sem output
A primeira utilizada para escrever algo na pgina, e a se-
gunda apenas para instrues sem gerao de output. Va-mos ento analisar o cdigo Ruby presente nesta pgina:
- uma tag Ruby comgerao de output (v-se pelo sinal de igual [ = ] ). Recebecomo parmetro o smbolo :all. Este mtodo olha para apasta stylesheets (dentro da pasta public) e gera cdigoHTML para que as folhas de estilo sejam adicionadas pgi-na. possvel definir um ficheiro isolado, mas neste casocom o smbolo :all, todas as folhas de estilo contidas na pas-ta sero carregadas.
- um mtodoem tudo semelhante ao anterior, com a diferena de queeste no est relacionado com folhas de estilos (CSS) massim com ficheiros de script client-side (Javascript) contidosna pasta scripts, dentro da pasta public. O smbolo :defaultspassado como parmetro visa carregar alguns ficheiros de
javascript, pertencentes Biblioteca Script.acol.us (http://script.aculo.us/) que vm junto com a aplicao. Existe quemdefenda que esta instruo no deveria ser automaticamenteadicionada a uma aplicao recm criada, pois implica o
carregamento de cerca de 140KB de ficheiros Javascript, ecomo ficheiros de javascript so carregados em srie, leva aum atraso que pode ser significativo e muitas vezes no seutiliza qualquer javascript.
- CSRF significa Cross Site Re-quest Forgery. Uma vulnerabilidade do Rails (e de outrastecnologias web) a capacidade de se gerar um request de
um website para outro, levando a que por vezes sejam servi-dos pedidos ilegtimos.
Esta instruo insere, como possvel ver no cdigo gerado,um token de autenticidade sob a forma de meta tag. Semeste token aces como a prpria submisso de um formul-rio poder no funcionar, por falta de autenticidade do re-quest. Desta forma possvel verificar se o request foi gera-do dentro do mesmo domnio ou no.
Existem formas explcitas de abrir o request para outrosdomnios especficos.
Mais informao:
http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf
Por ltimo temos a instruo . esta instruoque ser substituda pelo contedo da View. Como vimosanteriormente a View aparece com o layout sua volta.
, porm, necessrio, indicar qual o local, dentro do layout,
onde a view ser mostrada.
possvel ter mais do que uma instruo nomesmo template, sendo que desta forma, a partir do segun-do yield (inclusive), estes tero de ter um nome, para pode-rem ser referenciados de forma distinta.
Exemplo de um layout com dois yields:
Para que a sidebar seja preenchida no layout, ter de serusado mtodo content_for, seguido do nome do yield a quese refere.
Posso ter vrios layouts?
Sim. Imagine-se o cenrio tpico de um website com front-office e back-office. possvel ter dois (ou mais) layouts edepois, ao nvel do controller ou ao nvel da prpria actiondefinir qual ou template a ser usado, ou ento dizer que no
Este texto encontra-se no layout
.... html
.... html ....
Introduo ao Ruby on Rails
http://script.aculo.us/http://script.aculo.us/http://script.aculo.us/http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrfhttp://script.aculo.us/http://script.aculo.us/ -
8/3/2019 Revista_PROGRAMAR_30
21/90
21
se pretende que seja utilizado um template.
Criao de Modelos
Voltando ao objectivo de criar uma aplicao de lista de com-pras, vamos necessitar de criar o modelo de dados. Imagine
-se o seguinte modelo de dados:
Temos que uma lista de compras tem um identificador (id),um nome e uma prioridade, e poder ter vrios itens. Cadaitem estar ligado a uma lista e ter um campo chave (id), oid da lista a que pertence, um nome e um preo.
Este modelo de dados segue as naming conventions deRails: Utilizar nomes de tabelas no plural, o campo chaveem ambas as tabelas chama-se id. A chave estrangeira da
list na tabela de itens chama-se list_id: singular da tabelareferenciada, seguido de _id. Desta forma, deixamos asconvenes fazerem o seu papel, e no necessrio confi-gurar quais as chaves primrias, qual o nome das tabelas,qual o nome das chaves, etc.
altura de criar o modelo de dados na nossa aplicao. Asintaxe semelhante criao de controllers, mas agoraexistem mais informaes que necessitam de ser passadasno comando: os campos do modelo e os seus tipos de da-dos. Caso existisse j uma base de dados criada, os campos
poderiam ser inferidos a partir da base de dados. No entantovamos utilizar o paradigma Code First e vamos deixar queseja o Rails a criar a base de dados por ns.
A sintaxe para gerao de uma entidade de model :
rails generate Model nome_do_modelo [parametros]
Os atributos so passados a seguir ao nome do Model noseguinte formato:
nome_do_campo:tipo_de_dados
A passagem de parmetros facultativa. Se no forem pas-sados parmetros, os atributos da classe gerada sero inferi-
dos a partir da tabela da base de dados a que a entidade sereferencia. Iremos ver como configurar a ligao base dedados de seguida.
No vamos para j gerar o modelo para a lista de compras,pois ir ser utilizada outra tcnica (scaffolding) posteriormen-te.
Vamos ento criar o model para o item:
Ao observarmos o output do comando que acabmos deinvocar, vemos que foram criados 4 ficheiros.
Os primeiros dois, aps invocao doactive_record (abordado um pouco mais frente) so umficheiro de migrao, responsvel pela criao da tabela nabase de dados e o segundo o ficheiro que contm o Modelem si: a classe de Ruby que representa um item da lista de
compras.
Os outros dois ficheiros, criados aps invocao dounit_test, dizem respeito aos testes unitrios para a entida-de item. aqui que sero especificados os testes unitrios(no sero abordados neste artigo). Interessa notar quemum dos ficheiros um ficheiro Ruby (extenso .rb) e o outroum ficheiro YAML (extenso .yml). Este tipo de ficheiros serabordado aquando da configurao da base de dados.~
Scaffolding
O conceito de Scaffold (esqueleto), neste contexto, significaa construo de um back-end, dentro de uma aplicao infor-mtica, a partir dos dados e meta-dados contidos na base dedados.
A partir da anlise da estrutura da base de dados, gera cdi-go e interface para as operaes CRUD (Create, Read,Update, Delete).
Em Rails, o scaffolding apresenta-se como uma mais-valiada tecnologia. Se por um lado o resultado nem sempre oesperado, e em muitas das vezes existem vantagens emfazer manualmente a interface e cdigo para as operaes
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
22/90
22
de CRUD, outras vezes no existem grandes validaesnem outras regras de negcio por trs, o que leva a que oscaffolding seja uma forma rpida de produzir resultados.
Vamos utilizar scaffolding para gerar uma interface para geriras listas de compras. A gesto dos itens de cada lista serfeita do modo tradicional, ou seja, criando tudo mo.
A sintaxe da criao de um scaffold semelhante da cria-o do model. A criao de um scaffold agrega a criao deuma entidade do Model, e a criao de um controller e dasactions e views necessrias para que tudo funcione (da noter sido criado o Model list anteriormente).
Vamos ento criar o scaffold para a entidade list:
importante observar, no output do comando, que o scaffoldno faz nada por si s. O que faz invocar o active_record,o scaffold_controller e o gerador de stylesheets para que otodo o scaffold possa ser criado.
Note-se, ainda, que foi criado um controller chamado lists e
vrias Views para este controller (index, edit, show, new e_form). Iremos voltar ao controller e s views mais frente.
A partir da verso 2.0 do rails, deixou de ser possvel gerarum scaffold para uma entidade j existente, sendo a entida-de criada ao mesmo tempo que o scaffolding. por issonecessrio pensar bem se uma determinada entidade vai serusada com scaffolding ou no.
O Rails encarrega-se de adicionar um recurso s rotas, de
modo a que as ligaes usadas pelo scaffold para navega-o, funcionem:
map.resources :lists
Configurao da Base de Dados e Active Record
Falta apenas tratarmos da relao entre estes dois elemen-tos do Model para que o modelo de dados esteja definido porcompleto.
Para isso necessrio dizer que uma lista pode ter vriositens, e que um item pertence a uma lista. Parece simplesdizer isto desta forma, e de facto simples colocar esta lgi-ca no cdigo.
Abrindo o ficheiro list.rb que se encontra dentro da pastamodel, vamos ento indicar que uma lista pode ter vriositens:
Como possvel ver, esta no uma classe normal. umaclasse que deriva (herda) da classe Active Record - Base.Como tal contm alguns mtodos especiais, como o casodeste has_many. Este mtodo recebe um smbolo comoparmetro, e o smbolo (no plural neste caso) indica qual aentidade presente na relao.
Da mesma forma, no ficheiro item.rb vamos dizer que umitem pertence a uma lista:
O mtodo belongs_to indica que um item pertence a umalista (repare-se que o smbolo neste caso est no singular).
Tendo o modelo de dados definido, altura de fazer reflectirestas alteraes na base de dados. Mas qual base de da-dos? Existe um ficheiro chamado database.yml dentro dapasta config. Este ficheiro utiliza um formato chamado YAML(YAML aint markup language).
um formato de serializao como o XML e JSON que nocaso do Rails muito utilizado para configuraes. Basica-mente, em YAML, um elemento definido pelo seu nomeseguido de dois pontos ( : ).
Depois os campos/atributos deste elemento so precedidospor um espaamento (tab) e o valor de cada campo prece-dido de dois pontos ( : ).
class List < ActiveRecord::Base
has_many :itens
end
class Item < ActiveRecord::Base
belongs_to :list
end
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
23/90
23
Por exemplo, um animal poderia serializar-se da seguinteforma:
animal:
especie: Caoraca: Terriernome: Pintas
Voltando ao ficheiro database.yml, podemos ver que as con-figuraes da base de dados se encontram divididas porvrios ambientes:
O ambiente predefinido, e que nos interessa neste caso, oambiente de desenvolvimento. possvel mais tarde alteraro ambiente de funcionamento (para produo, por exemplo).Podemos ver que est a ser utilizado o motor de base dedados sqlite3, e que a base de dados ir residir dentro dapasta db e que se ir chamar development.sqlite3. Esttambm definido o nmero mximo de ligaes e o tempomximo de espera.
Caso o motor de base de dados fosse diferente (por exemploMySQL) os campos da parametrizao seriam outros (host,
username, password, ...). A separao por ambientes permi-te-nos facilmente mudar de ambiente, e fazer testes na basede dados de desenvolvimento, evitando fazer testes em base
de dados de produo. Dado que no vamos, desta vez,alterar a configurao da base de dados, vamos fechar oficheiro e vamos migrar o nosso modelo de dados para abase de dados.
Antes de procedermos migrao, vamos ver os ficheiros demigrao que foram gerados. Estes ficheiros (um por cadaentidade) devero estar na pasta db/migrate. Vamos abrir oficheiro de migrao para a entidade Item.
possvel ver que o script de migrao pertence ao ActiveRecord - Migration, e que tem dois mtodos: o up e o down.O mtodo up serve para criar a tabela na base de dados. possvel identificar os campos do item, que sero traduzidosem colunas da tabela. O mtodo down serve para reverter amigrao, o que neste caso significa a destruio da tabela.
Vamos ento proceder migrao. Para isso recorremos aocomando
rake db:migrate
# SQLite version 3.x
# gem install sqlite3
development:adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
# Warning: The database defined as "test" will be
erased and
# re-generated from your development database
when you run "rake".
# Do not set this db to the same as development
or production.
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000
class CreateItens < ActiveRecord::Migration
defself.up
create_table :itensdo|t|
t.integer :id
t.integer :list_id
t.string :name
t.float :price
t.timestamps
end
end
defself.down
drop_table :itens
end
end
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
24/90
24
Como possvel ver pelo output, tal como esperado, foramcriadas duas tabelas.
Abrindo o ficheiro da base de dados de desenvolvimento
num qualquer utilitrio que trabalhe com SQLite (neste casoo SQLite Maestro) possvelver que as tabelas e respecti-vas colunas foram criadas.
de notar que existe umatabela que no crimos, e quecontm dados relacionadoscom a migrao do modelo dedados.
tambm importante referirque foram adicionados doiscampos a cada tabela: upda-ted_at e created_at. Estes sodois campos do tipo datetime eautomagicamente (graas aoactive_record) guardam a data/hora de criao ou alteraodo objecto.
Estando o modelo de dados reflectido na base de dados,
podemos iniciar o servidor e tentar abrir o scaffold da lista,atravs do controller lista que foi criado.
Vamos aceder ao seguinte url: http://localhost/lists, que nosd acesso a uma tabela com as listas j existentes(inicialmente vazia) e uma ligao para o formulrio que per-mite criar novas listas.
Nota: quando apenas o controller passado no URL, a acti-on chamada a index
Todo o cdigo gerado est disponvel para consulta e altera-o, tanto ao nvel do controller como ao nvel das Views, e uma boa forma de perceber como o Rails funciona.
Vamos agora fazer o mesmo processo para os itens, massem usar scaffolding. Por questes de brevidade iro apenasser demonstrados a criao e listagem de itens.
O primeiro passo ser gerar o controller para os itens. Estecontroller ir conter as actions (e Views) para listar, criar,alterar e apagar itens de uma determinada lista.
generate controller itens
Vamos adicionar uma action chamada new. Esta action e arespectiva view tero como responsabilidade permitir a cria-o de um novo item. tambm necessrio criar o ficheiroda View, dado que no criado automaticamente.
Uma varivel/objecto pode ser passado do controller para a
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
25/90
25
view, simplesmente colocando uma arroba antes do nome davarivel.
Controller (ficheiro itens_controller.rb):
Nesta action definida uma varivel com o ttulo. Esta umavarivel global, pois comea com uma arroba, e desta forma
poder ser acedida dentro da view.
tambm definida uma varivel global chamada lists. A clas-se List, estende a classe ActiveRecord, pelo que contmuma srie de mtodos relacionados com o acesso a dados.
O ActiveRecord uma ferramenta ORM, e como tal permiteque o developer se concentre no desenvolvimento, abstrain-do de uma forma completa a base de dados. No sequernecessrio escrever SQL, dado que atravs dos mtodos
disponveis, o ActiveRecord encarrega-
se de gerar o SQLnecessrio.
Um desses mtodos o find. Este mtodo recebe comoparmetros elementos como condies de pesquisa, o n-mero de elementos e o offset (para paginao), e devolveum Array com elementos, trazidos directamente da base dedados.
Vamos ver mais alguns mtodos do ActiveRecord mais frente, medida que vai sendo necessrio utiliz-los.
Abrindo a janela da consola, onde o servidor est a ser exe-cutado, possvel ver o cdigo SQL gerado.
View (ficheiro views/itens/new.rhtml):
Passemos ento anlise do cdigo da View para a constru-o do formulrio. Como possvel ver, para aceder vari-vel com o ttulo, basta invoc-la, sem esquecer da arrobaantes do nome da varivel.
O Rails proporciona tambm Helpers para a construo doformulrio. Ainda que este possa ser construdo com HTML,a utilizao dos Helpers ajuda a reduzir o cdigo e a torn -lomais fcil de ler.
A instruo form_tag, recebe a aco, que neste caso est
direccionada para a Action Create. Quando se omite o Con-troller, assume-se que a aco pertence ao controller actual.
Esta instruo termina com o end, no final da pgina e consi-dera-se que tudo o que estiver entre estas duas instruesest dentro do formulrio. Basicamente traduzem-se nastags e do HTML, respectivamente. Os Hel-pers no se limitam criao do formulrio, mas tambm nacriao dos campos deste.
A sintaxe do Helper para criao de inputs de texto a se-guinte:
text_field :nome_objecto, :nome_do_campo
Por exemplo, para criar uma caixa de texto, para o camponame de um objecto chamado item utiliza-se a instruo
text_field :name, :item
A criao de um Select (ou uma caixa de seleco) tam-bm beneficia de um Helper. Na action que invoca estaView, crimos uma varivel global chamada @lists, ondepassmos, atravs do mtodo find do ActiveRecord, todas as
listas da base de dados.
Em que formato vm estas listas? Existe uma forma de sa-
def index
@title="Lista de Artigos"
@itens=Item.find(:all,:order=>'list_id')
end
{ :action => "update" ,:id=>@item.id} do | f | %>
Id:
true %>
Nome:
Preo:
Lista:
Voltar
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
26/90
26
ber qual o contedo de uma varivel, e qual o seu formato.Vamos, por momentos, comentar todo o cdigo da View eadicionar uma s linha:
Esta instruo serializa (em formato YAML) o objecto ou acoleco de objectos. Neste caso, existem duas listas nabase de dados e o resultado este:
---- !ruby/object:Listattributes:
name: Supermercado
created_at: 2011-07
-14 22:46:05.199146
updated_at: 2011-07-14 22:46:05.199146
id: 1
prioridade: 1
attributes_cache: {}
changed_attributes: {}
destroyed: false
marked_for_destruction: false
new_record: false
previously_changed: {}
readonly: false
- !ruby/object:Listattributes:
name: "M\xC3\xBAsica"
created_at: 2011-07-14 22:46:34.065217
updated_at: 2011-07-14 22:46:34.065217
id: 2
prioridade: 3
attributes_cache: {}
changed_attributes: {}
destroyed: false
marked_for_destruction: false
new_record: false
previously_changed: {}
readonly: false
Este o resultado da serializao, com o mtodo debug.Este mtodo torna-se especialmente til quando algo corremal e no se sabe muito bem de onde vem o problema.
Interessa reter que cada elemento da lista tem um campo id,e um campo name, que sero utilizados na caixa de selec-o. Podemos agora retirar a instruo de debug e desco-mentar o restante cdigo.
Voltando caixa de seleco do formulrio, a instruo se-lect recebe e o nome do objecto (:item) e o nome do campo
(:list_id). De seguida recebe a coleco dos itens que vocompor a listagem. O mtodo collect, vai pegar em cada itemda coleco, temporariamente identificado por lista e vaiconstruir um conjunto de dois valores: o nome e o id.
Esta lista de elementos com estes dois valores vai povoar acaixa de seleco.
Por ltimo existe um Helper para o boto de Submit sub-mit_tag que recebe o valor a apresentar no boto.
O resultado desta view o seguinte:
Vamos analisar o cdigo HTML gerado pelos helpers.
Nome:
Preo:
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
27/90
27
possvel encontrar imediatamente a tags com omtodo post e a action especificada no helper e o controllercontinua o itens. No final do formulrio est a tag atermin-lo.
tambm possvel ver que foi criado um campo escondidochamado autenticity_token que serve para que a autentici-dade do request possa ser comprovada pelo Rails. Este to-ken comparado com o token que figura na seco da pgina e que falmos anteriormente (CSRF).
ainda possvel ver que o nome de todos os campos segueum padro: nome_do_objecto[nome_do_campo]. Este pa-dro tem uma razo de ser, pois facilita muito a criao doobjecto Ruby a partir dos valores do formulrio, como vere-mos de seguida.
Passemos ento criao da Action responsvel pela reco-lha dos dados passados pelo formulrio e pelo registo doitem na base de dados. Falamos da Action Create doController Itens.
Estas 3 linhas de cdigo so suficientes para pegar nosdados do formulrio e guardar o objecto na base de dados.De facto, as primeiras duas linhas bastam. A terceira linhaapenas redirecciona o browser para View Index, que ir,dentro de alguns momentos, conter a listagem de todos ositens, presentes em todas as listas de compras.
A instruo presente primeira linha do mtodo obtm a partirdos valores passados pelo formulrio (neste caso via POST)
o objecto item. Da aquela notao do tipo item[name] nonome dos campos do formulrio.
A segunda linha chama o mtodo save (herdado do Active-Record) e o objecto automaticamente persistido na basede dados.
No vamos testar ainda, pois falta o local onde ver os itens.Vamos passar criao da Action index, que ir trazertodos os itens da base de dados e mostr-los numa tabela.
Action index do controller Itens (ficheiro itens_controller.rb):
Da mesma forma que anteriormente, utiliza-se o ActiveRe-cord para trazer todos os itens, mas desta vez, ordenadospelo campo list_id.
View Index (ficheiro itens/index.rhtml):
Lista:
Supermercado
Msica
def create
@item = Item.new(params[:item])
@item.save
redirect_to(:action=>'index')
end
defndex
@title="Lista de Artigos"
@itens=Item.find(:all,:order=>'list_id')
end
Nome
Preo
Lista
Editar
Eliminar
Novo Item
Introduo ao Ruby on Rails
-
8/3/2019 Revista_PROGRAMAR_30
28/90
28
Basicamente iteramos sobre a coleco, mostrando os da-dos sob a forma de uma linha de tabela. Note -se que acede-mos ao atributo list ele trazido da base de dados, como
objecto, neste caso, mostrando o campo nome. O carrega-mento de objectos relacionados feito com LazyLoad, ouseja, s em caso de o objecto ser requerido que trazidoda base de dados, caso contrrio, a relao no feita. Nofinal do ficheiro, est uma ligao para o formulrio que per-mite a criao de mais itens.
Nota: Esto tambm a ser criados dois links para a alteraoe destruio dos itens. Apesar de estes duas componentesda aplicao, por questes de brevidade, no serem aborda-das no artigo, esto contidas no cdigo da aplicao, cujo
link para download est no final do artigo.
Vamos ento ver o resultado:
possvel ver na consola o SQL gerado pelo ActiveRecord:
Repare-se que feita uma query inicial tabela de itens, edepois so feitas vrias queries tabela de listas. Isto acon-tece porque estamos, para cada item, a aceder lista qual
ele pertence, e essa operao gera uma query.As restantes Views e Actions seguem um raciocnio seme-lhante. O cdigo fonte da aplicao completa, encontra-separa download (ver parte final do artigo).
Concluso
Por agora tudo. Apesar de ter sido um exemplo simples,espero ter demonstrado como o Ruby on Rails funciona e,pelo menos, ter despertado o vosso interesse para esta tec-nologia.
O que foi abordado aqui foi apenas uma muito pequena par-te desta vasta e rica tecnologia de desenvolvimento web.
Links teis
Para quem quiser aprofundar mais, deixo um conjunto delinks que sero certamente muito interessantes.
Cdigo Fonte da aplicao de demonstrao:
https://github.com/CarlosRodrigues/DemoRailsRevistaProgramar
Webcasts sobre Rails: http://railscasts.com/Site Oficial Ruby (PT): http://www.ruby-lang.org/pt/Site Oficial Rails: http://rubyonrails.org/Documentao Ruby: http://www.ruby-doc.org/Documentao API Rails: http://api.rubyonrails.org/Comunidade Ruby-pt: http://www.ruby-pt.org/Alojamento Rails (gratuito no pacote mais bsico): http://www.heroku.com/
Livro: Whys (poignant) guide to Ruby: http://www.rubyinside.com/media/poignant-guide.pdf
Escrito por Carlos RodriguesLicenciado em Engenharia Informtica pelo Instituto Politcnico de Viseu, frequenta actualmente o Mestrado em Sistemas e
Tecnologias de Informao para Organizaes na Escola Superior de Tecnologia de Viseu. actualmente consultor / progra-mador na rea da banca, por uma multinacional Portuguesa na regio de Lisboa e formador em regime de freelance. Interes-sa-se pelo desenvolvimento para web e para dispositivos mveis.
Twitter: @crodriguesPTBlog: http://crodrigues.com
Introduo ao Ruby on Rails
https://github.com/CarlosRodrigues/DemoRailsRevistaProgramarhttps://github.com/CarlosRodrigues/DemoRailsRevistaProgramarhttps://github.com/CarlosRodrigues/DemoRailsRevistaProgramarhttp://railscasts.com/http://railscasts.com/http://www.ruby-lang.org/pt/http://www.ruby-lang.org/pt/http://www.ruby-lang.org/pt/http://www.ruby-lang.org/pt/http://rubyonrails.org/http://rubyonrails.org/http://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://www.ruby-doc.org/core/classes/Symbol.htmlhttp://api.rubyonrails.org/http://www.ruby-pt.org/http://www.ruby-pt.org/http://www.ruby-pt.org/http://www.ruby-pt.org/http://www.heroku.com/http://www.heroku.com/http://www.heroku.com/http://www.rubyinside.com/media/poignant-guide.pdfhttp://www.rubyinside.com/media/poignant-guide.pdfhttp://www.rubyinside.com/media/poignant-guide.pdfhttp://www.rubyinside.com/media/poignant-guide.pdfhttp://www.rubyinside.com/media/poignant-guide.pdfhttp://twitter.com/crodriguesPThttp://twitter.com/crodriguesPThttp://crodrigues.com/http://crodrigues.com/http://crodrigues.com/http://twitter.com/crodriguesPThttp://www.rubyinside.com/media/poignant-guide.pdfhttp://www.rubyinside.com/media/poignant-guide.pdfhttp://www.heroku.com/http://www.heroku.com/http://www.ruby-pt.org/http://api.rubyonrails.org/http://www.ruby-doc.org/core/classes/Symbol.htmlhttp://rubyonrails.org/http://www.ruby-lang.org/pt/http://railscasts.com/https://github.com/CarlosRodrigues/DemoRailsRevistaProgramarhttps://github.com/CarlosRodrigues/DemoRailsRevistaProgramar -
8/3/2019 Revista_PROGRAMAR_30
29/90
-
8/3/2019 Revista_PROGRAMAR_30
30/90
30
Neste artigo so apresentadas informaes introdutrias ebsicas sobre o uso da linguagem Lua embutida dentro deprogramas escritos em C e C++. Alm deste tema apresenta-se tambm informaes relacionadas ao uso de co-rotinas.
Para a execuo dos programas codificados nas linguagensC e C++ integrados com a linguagem Lua deve -se levar emconsiderao o uso do compilador GCC.
Linguagem de Script
Em 12 de Maio de 2011 foi publicado na revista ACM Queue Architecting Tomorrow's Computingo artigo intitulado Pas-sing a Language through the Eye of a Needle (Passandouma Linguagem atravs do Buraco de uma Agulha), ondeRoberto Ierusalimschy, Luiz Henrique de Figueiredo e Wal-demar Celes arquitectos da linguagem Lua falam sobre ouso da linguagem Lua com outras linguagens.
Em http://www.lua.org/portugues.html, se l que Lua umaengine rpida e pequena que voc pode facilmente embutirna sua aplicao. Lua tem uma API simples e bem documen-
tada que permite uma integrao forte com cdigo escrito emoutras linguagens. simples estender Lua com bibliotecasescritas em outras linguagens. Tambm simples estender programas escritos em outras linguagens com Lua. Lua usada para estender programas escritos no s em C e C++,mas tambm em Java, C#, Smalltalk, Fortran, Ada, Erlang, emesmo outras linguagens de script, como Perl and Ruby.
Dentro da temtica desta discusso que este artigo mostracomo fazer a integrao de cdigo em linguagem Lua(linguagem de script) de forma embutida em cdigos previa-mente escritos em C e C++.
A linguagem de programao Lua possui duas importantescaractersticas, pode ser usada como linguagem de extensoe como linguagem extensvel, ou seja, o fluxo de comunica-o com a linguagem Lua bidireccional. Como linguagemde extenso, Lua pode ser usada juntamente com outra lin-guagem no sentido de estender alguma funcionalidade em-butida para esta outra linguagem.
Como linguagem extensvel, Lua pode ser usada para obteruso de recursos existentes em outra linguagem, a fim de secompletar. A comunicao entre as linguagens C, C++ e Lua
pode ocorrer sob duas esferas: na primeira esfera por meioda definio de uma instncia de estado de operao e nasegunda esfera por meio do uso do conceito de pilha. Ofoco de estudo deste artigo concentra-se na primeira esfera.
Lua Embutida
Lua foi concebida para comunicar-se com a linguagem C, ouseja, foi preparada para ser uma biblioteca da linguagem C.No entanto, permite ser usada como linguagem independen-te como apresentado nas nove partes anteriores desta sriede artigos.
Usar a integrao de Lua com C++ foi uma ocorrncia natu-ral, devido origem de C++ a partir de C. No caso de uso
das linguagens C e C++, o uso de Lua semelhante entreelas. Assim sendo, necessrio fazer uso dos arquivos de
cabealho lua.h, lauxlib.h e lualib.h; integrantes da bibliote-ca Lua, de-nominadas API C, a qual escrita em ANSI C. Asfunes do arquivo lua.h so iniciadas pelo prefixo lua_, asfunes do arquivo auxiliarlauxlib.h so iniciadas pelo prefi-xo _luaL e o arquivo lualib.h d acesso s bibliotecas pa-dro da linguagem Lua.
A identificao do uso das bibliotecas de API C em lingua-gem C utilizada com a chamada dos arquivos de cabea-
lho que so configuradas dentro da funo main a partir da
definio em negrito indicado a seguir:
A identificao do uso das bibliotecas de API C em lingua-gem C++ utilizada com a definio do bloco externo com aclusula extern a partir da definio em negrito indicado aseguir:
#include
#include
#include
#include
int main(void)
{