Pode me chamar de velha guarda, mas prefiro escrever meu próprio Javascript. E depois que comecei a trabalhar com Ruby on Rails e jQuery, minha vida ficou infinitamente mais simples.

E dessa simplicidade, surgiu o rails.js, um dispatcher de eventos feito para ser usado com jQuery, no Rails.

A idéia é que, baseado no controller e action que está sendo renderizado, seja chamado o método correto do Javascript para aquele contexto.

Para ver como funciona na prática, crie um novo projeto com o comando abaixo.

rails pages

Você precisará de um controller chamado "pages", com algumas actions.

script/generate controller index show new create edit update

Crie também um arquivo de layout em "app/views/layouts/application.html.erb" com o conteúdo abaixo.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <title>Pages</title>
        <%= javascript_include_tag "jquery", "rails", "pages" %>
 
        <meta name="rails-controller" content="<%= controller.controller_name %>" />
        <meta name="rails-action" content="<%= controller.action_name %>" />
    </head>
<body>
    <%= yield %>
</body>
</html>

O segredo está nesses dois campos meta, com os nomes do controller e action. É baseado neles que o rails.js irá chamar o método correto.

Agora vem o passo mais importante de todos: remova os arquivos do Prototype. Afinal, eles não servirão para nada! ;)

rm public/javascripts/*

Você precisará do jQuery e do rails.js. Copie-os para o diretório "public/javascripts". Crie também um arquivo em "public/javascripts/pages.js".

Agora, vem a parte legal! Por exemplo, imagine que você queira executar algum Javascript para as actions "index" e "new". Você pode criar algo como isso.

Rails.pages = {
    'index': function() {
        alert('calling js for index');
    },
 
    'new': function() {
        alert('calling js for new');
    }
}

Se você acessar o endereço http://localhost:3000/pages/, o método Rails.pages.index() será chamado.

E o que acontece se eu acessar a action "create", que normalmente é o fallback do método "new"? Quando você acessar a action "create", o método "new" será chamado no lugar, assim como a action "update" chamará o método "edit". Para ver como isso funciona, experimente acessar os endereços http://localhost:3000/pages/new e http://localhost:3000/pages/create.

Eu tenho uma opinião bastante forte a respeito do Rails gerar Javascript. É conveniente? Claro que é! Mas ainda sim prefiro escrever meu próprio Javascript.

Você pode fazer o download deste exemplo aqui.

Comentários #

#1 Marco Gomes disse:
04 Jun 08, 12:13AM

Eu sempre achei que o Rails gerar JS é tão "recomendável" quanto usar o velho scaffolding ou os pesados métodos do ActiveRecord: Use pra coisas rápidas e inocentes, mas não coloque isso em Produção numa aplicação com muitos acessos, pelo amor de Jah.

Eu não sabia como funcionava a integração de outra biblioteca no Rails (já que não sou desenvolvedor Rails), agora já sei em teoria, ótimo post.

E da próxima vez, chame a biblioteca pelo nome completo: JesusQuery XD

#2 Aguinelo Pedroso disse:
05 Jun 08, 01:25PM

Muito bom Nando, não sabia que era tão integrado assim, vou começar a brincar com estes 2....

#3 Charleno Pires disse:
23 Jul 08, 07:22PM

Caramba Nando, esse post é tão bom e útil, que só pra você ter uma idéia, aqui na empresa estamos todos fazendo dessa forma. Não acho bom trabalhar no modo implícito, toda vez, sem saber o que está acontecendo, sem saber se o modo como está sendo feito pela framework tem ou não performance. É bom podermos ter escolha. Sei que essa característica implícita é herdada do próprio Ruby, mas enfim...

#4 Caio Moritz Ronchi disse:
28 Ago 08, 11:56AM

Muito legal, comecei a usar sua biblioteca hoje. Eu desenvolvi uma similar para um framework PHP anos atrás, e graças ao seu Rails.js posso usar minhas mesmas práticas no Rails. Parabéns!

#5 Fernando disse:
09 Out 09, 01:47PM

Nando, e se eu precisar utilizar um mesmo código em duas actions distintas?

#6 Bruno Selva disse:
12 Out 09, 03:01AM

Fala Nando ! Blz ?

Estou sempre dando uma lida por aqui, mas concordo com o Marco Gomes. O JQuery indica outro caminho que o urubatan acertou na mosca. da uma lida:

http://www.urubatan.com.br/autocomplete-para-rails-com-jquery-muito-facil/

#7 Nando Vieira disse:
14 Out 09, 09:16PM

Fernando #5: Você pode fazer algo como Rails.comments = Rails.pages.

Bruno, é exatamente esse o objetivo do Rails.js. Nenhum código é gerado pelo Rails e você é quem tem que fazer tudo! ;)

#8 Douglas Dorô disse:
17 Nov 09, 02:09PM

Legal. Isso vai me ajudar em algumas coisas que estou fazendo. Também prefiro escrever meu próprio código javaScript.

Abs,

#9 Douglas Dorô disse:
11 Dez 09, 08:50AM

Se usar map.resources :pages quebra =(

#10 Nando Vieira disse:
11 Dez 09, 08:53AM

Douglas, não você pode subir no pastie um exemplo do código que você está usando?

#11 Thiago Tiveron disse:
02 Fev 10, 06:23PM

Muito bom. Ao invés de criar vários js para iniciar partes específicas de uma lib, você centraliza tudo nesse esquema. parabéns ;)

#12 Hamilton Mota disse:
03 Mar 11, 12:06PM

Ow, uma duvida,
aquelas funcionalidades que uso nos projetos tipo observe_field param de funcionar.
Tem como manter essas funcionalidades e usar o jquery?
Valeu

#13 Nando Vieira disse:
03 Mar 11, 05:16PM

Não sei, porque nunca usei nada disso.

#14 rafael disse:
13 Maio 11, 10:51AM

Uma dúvida.
Tenho um link que abre uma janela modal através do facebox_render com uma layout diferente do padrão. Não estou conseguindo que rodar o script jquery da respectiva página que abre. Por exemplo:

o link abre a action 'new' do controller 'login'.
no pages.js tenho um código para login#new que não está rodando...
alguma idéia?

Deixe um comentário





Não é aceito código HTML: adicione-o no pastie.org ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.

jQuery: Dominando o framework

Você quer aprender a usar jQuery de verdade? Então chegou a hora! Neste workshop você verá como funciona este framework de JavaScript, entendendo todos os aspectos que fazem do jQuery uma das melhores ferramentas para desenvolvimento de interfaces.

Saiba mais Fechar

Conheça também o HOWTO