Usando jQuery com Rails
04 de Junho de 2008
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.
Textos escritos por
Comentários #
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
Muito bom Nando, não sabia que era tão integrado assim, vou começar a brincar com estes 2....
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...
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!
Nando, e se eu precisar utilizar um mesmo código em duas actions distintas?
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/
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! ;)
Legal. Isso vai me ajudar em algumas coisas que estou fazendo. Também prefiro escrever meu próprio código javaScript.
Abs,
Se usar map.resources :pages quebra =(
Douglas, não você pode subir no pastie um exemplo do código que você está usando?
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 ;)
Deixe um comentário