Revista_PROGRAMAR_30

download Revista_PROGRAMAR_30

of 90

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)

    {