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.

JavaScript Avançado

O JavaScript é a única linguagem que muitos acreditam saber sem nunca terem parado para realmente aprendê-la. Neste workshop rápido você entenderá de verdade todos os conceitos avançados do JavaScript em 4 horas puramente práticas.

Saiba mais Fechar

Conheça também o HOWTO