[Logo] Menta Developers Blog
  [Search] Search   [Recent Topics] Recent Topics   [Hottest Topics] Hottest Topics   [Members]  Member Listing   [Groups] Back to home page 
[Moderation Log] Moderation Log   [Register] Register / 
[Login] Login 
[Logo]
Ruby MVC - Começando pelo começo!  XML
Forum Index » Sobre Tudo (Português)
Author Message
saoj


[Avatar]

Joined: 13/12/2007 14:28:28
Messages: 26
Offline




Estou fazendo minhas primeiras aventuranças pelo mundo Ruby e para começar do começo andei procurando um framework web para desenvolver aplicações MVC em Ruby. Antes de alguém gritar Ruby on Rails, vou explicar: Do mesmo jeito que Java possui Servetls/JSP, Ruby também deveria ter um framework padrão para a web. Algo que pudesse ser utilizado como uma *fundação* para a construção de aplicações web e de outros frameworks.

Depois de bater a cabeça fuçando a web e de postar no forum da comunidade RubyOnBR, cheguei a conclusão (espero não estar equivocado) de que o que eu estou procurando se chama MERB. Basicamente MERB = Mongrel = melhor servidor web em Ruby + ERB = template engine em Ruby para os RSP (Ruby Server Pages). Se bem que andei lendo por aí que ele agora está usando uma outra engine de templates duas vezes mais rápida que o ERB.

O objetivo desse post é fazer uma introdução de como usar o MERB do ponto de vista de um programador Java que está pulando de para-quedas no mundo Ruby. Estou assumindo que vc já instalou a última versão do Ruby na sua máquina, e que ela já veio com o RubyGems, que é um programinha para instalar estensões do Ruby remotamente, parecido com o PPM do PERL.



Para instalação do MERB, tudo que vc tem que fazer é rodar o comando abaixo em qualquer diretório:



Se tudo correr bem, vc terá o tal do MERB instalado na sua máquina:



Agora vamos gerar o esqueleto de uma aplicação inicial usando o comando:



Feito isso ele deve ter criado um diretório HelloMerb com as seguintes pastas dentro:



OBSERVAÇÃO: Em todos os tutorias que eu encontrei na web sobre o Merb era dito que o diretório com a distribuição da aplicação se chamava dist. Parece que agora ele se chama app.

Antes de começarmos a meter a mão na massa, vá até o diretório HelloMerb recém-criado e execute merb de dentro dele. O que vc está tentando fazer é iniciar o web server para servir sua aplicação em Ruby.

Para sua felicidade vc provavelmente receberá o seguinte erro:



Isso quer dizer em linguagem Ruby que o merb precisa do JSON e que ele não está instalado. Mais uma fuçada na Internet e descobrimos que para instalar o JSON é mole:



Mais aí pro seu azar vc vai receber o seguinte erro:



Não se desespere! Depois de muito fuçar a Internet acabei descobrindo esse site aqui: http://rubyforge.org/frs/?group_id=953

Baixe o arquivo json-1.1.1-mswin32.gem e execute o comando:



Ufa!!! Conseguimos instalar o JSON, agora vamos ver se o MERB funciona:



Legal, parece que está rodando agora! Mas não tente acessar o seu servidor ainda, pois a nossa aplicação ainda está vazia. Logo vamos escrever a nossa tão desejada action! Dentro do diretório HelloMerb/app/controllers/. O nome do arquivo pode ser hello.rb



Na linguagem do Merb, nosso controlador se chama Hello e a nossa action se chama sayHello. Para acessar essa action, vc terá que utilizar a seguinte URL:

http://localhost:4000/Hello/sayHello

Repare que no final do método sayHello foi invocado o método render. Esse método é o famoso foward dos servlets. Por convenção ele vai jogar a requisição para a página sayHello.html.erb que deverá estar no diretório HelloMerb/app/views/hello/. O código da nossa página RSB (Ruby Server Pages) está abaixo:



Nela estamos apenas imprimindo o valor da variável de instância hi.

Estamos pronto para executar a nossa primeira aplicação web usando Ruby e o seu framework/servidor Merb! Salve os seus arquivos e restarte o seu merb (não esquecer de fazer isso dentro do diretório HelloMerb da sua aplicação). Agora acesse a URL http://localhost:4000/Hello/sayHello e vc deverá ver a mensagem renderizada no seu browser!

Antes de terminarmos, duas observações importantes:

1) Se vc olhar o código fonte do html gerado pela action, notará que o Merb automaticamente adicionou um layout e um stylesheet para na sua página. Isso é apenas uma das surpresinhas que o Ruby prepare para vc. As vezes vc gosta do presente, outras vezes vc fica sem graça e apenas agradece. Se vc quiser modificar esse layout vc pode alterar o arquivo HelloMerb/app/views/layout/application.html.erb. Eu por exemplo comentei o stylesheet usado nesse template:



2) Também é possível fazer mapeamentos (routes) com o Merb. Por exemplo se o usuário digitar http://localhost:4000/ ele receberá o seguinte erro: "No routes match the request". Para resolver isso vamos criar um route para a nossa aplicação. Abra o arquivo HelloMerb/config/router.rb e adicione a seguinte linha:



Não é necessário restartar o Merb. Agora quando vc acessa a URL http://localhost:4000/ a sua action sayHello é executada!

O que ficou faltando aprender/entender:

1) Podemos usar o método redirect ao invés de render para jogar a action para uma outra action ao invés de para um arquivo ERB. Parece que o método render também suporta um parametro, mas ainda não entendi para que serve esse parametro e como usá-lo.

2) É possível com o Merb acessar diretamente uma página ERB, sem passar por nenhuma action? Parece que não...

3) O Merb suporta filtros, que podem ser usados para autenticação, validacão, etc. Seria importante entender como eles funcionam.

4) As páginas ERB possuem muito código Ruby no meio do HTML. Seria legal entender como podemos minimizar isso. Talvez criando métodos que se comportariam de forma parecida as customs tags de um JSP.


Espero que esse post ajude aos que, como eu, estão vindo do mundo Java e gostariam de entender sem muita enrolação como as coisas funcionam no mundo Ruby para aplicações web.

Deiverson


[Avatar]

Joined: 14/12/2007 09:40:04
Messages: 1
Location: Brazil
Offline

Olá saoj,

Gostei muito da introdução e do compartilhamento do seu conhecimento em relação a resolução de alguns problemas que você enfrentou na instalação do MERB.

So para eu entender melhor, o MERB seria uma alternativa Ruby equivalente a um servidor de aplicação (Tomcat) com tipo um Struts embutido?

Abraços,

Deiverson Silveira

"Não se pode ensinar alguma coisa a alguém, pode-se apenas auxiliar a descobrir por si mesmo." (Galileu Galilei)

"A paciência é forjada ao irmos constantemente de encontro aos nossos limites..."

"Não sabendo que era impossível, ele foi lá e fez..." (Jean Cocteau)
[WWW]
saoj


[Avatar]

Joined: 13/12/2007 14:28:28
Messages: 26
Offline


O Merb foi o que eu encontrei em Ruby mais próximo do modelo Servlets + JSP. Ele seria um TOMCAT com suporte a servlets e JSP.

No caso o servidor web do Merb é o Mongrel (mesmo utilizado pelo Rails) e ele possui seu próprio esquema (framework) de controller e views.

Ficou faltando agora descobrir a resposta para aquelas perguntas no final do meu post. Assim que eu descobrir posto aqui ou faço outro BLOG!
saoj


[Avatar]

Joined: 13/12/2007 14:28:28
Messages: 26
Offline


Resposta do Henrique C. em http://forum.rubyonbr.org/forums/1/topics/2499?page=2


2) É possível com o Merb acessar diretamente uma página ERB, sem passar por nenhuma action? Parece que não…

Se você quer processar o script direto, como se fosse um PHP, então não precisa do framework, nem do dispatcher, nem do mongrel. É só ter um servidor configurado com mod_ruby, FCGI+ERB ou (pior) CGI e registrar o mime-type do .rb direto (não recomendo, tem muitos problemas com memória, dados compartilhados entre instancias, etc. Ruby não funciona bem como script na web, funciona melhor como aplicação).

4) As páginas ERB possuem muito código Ruby no meio do HTML. Seria legal entender como podemos minimizar isso. Talvez criando métodos que se comportariam de forma parecida as customs tags de um JSP.

Se você buscar alternativas pra minimizar isso, vai acabar fazendo um framework MVC e Helpers. Vai deixar a lógica dentro de um Controller e usar um template ERB como View, e vai ainda montar helpers para gerar snippets mais facilmente e com menos código.

O Merb segue a mesma estrutura que o J2EE, que por sua vez é a mesma coisa que um Rails sem ORM e sem Helpers (e com um sistema de plugins pra plugar o resto do framework, arquivos XML no caso do J2EE). Se você tiver que integrar um ORM e fazer alguns Helpers para tornar o Merb mais funcional (da mesma maneira que pega o J2EE e pluga mais coisas – Hibernate, Struts – pra tornar funcional), vai chegar no mesmo resultado que o Rails. Vai ser só mais do mesmo.

O Merb realmente brilha só se for para implementar algo de escopo específico, que demande uma persistência de dados diferente (um banco de dados esotérico, ou persistência via outro sistema), ou então uma necessidade de output diferente, e que no Rails fica muito mais difícil implementar por causa da quantida de convenções que existem.

EDIT: Mais informações sobre opções de uso do Ruby na web http://www.narf-lib.org/2006/04/limits-to-scaling-ruby.html

saoj


[Avatar]

Joined: 13/12/2007 14:28:28
Messages: 26
Offline

Novas dicas:

Para dar um update no RubyGems, digite:


Na última versão do RubyGems, vc não existe mais o --include-dependencies: (se vc usá-lo obterá um erro)


O problema do JSON parece que foi sanado, ou seja, não precisa correr atrás do JSON.

Na última versão do Merb, não é mais necessário usar o parâmetro -g quando vc for criar a sua aplicação:


Os parâmetros chegam na action através do hash params, ex:


Para remover o layout da sua página, basta chamar render assim:


 
Forum Index » Sobre Tudo (Português)
Go to:   
Powered by JForum 2.1.8 © JForum Team