No último projeto que estou trabalhando, resolvi utilizar jQuery em vez do prototype padrão …
E eu precisava de um campo de texto com auto completar, e mesmo que estivesse utilizando o prototype, não seria muito fácil utilizar o plugin de autocomplete do rails por que eu precisava deste auto complete em um campo de texto que existe diversas vezes dentro do mesmo form, e novos são adicionados via RJS, isto complicava muito a minha vida por que o ID destes campos adicionados automagicamente é o mesmo …
Como estava utilizando o jQuery, atravéz do plugin jRails isto se tornou muito fácil, bastou utilizar o plugin suggest do proprio jQuery …
O processo para habilitar este autocomplete é bem simples como vocês podem ver abaixo.
Primeiro, instalando o plugin jRails:
script/plugin install http://ennerchi.googlecode.com/svn/trunk/plugins/jrails
rake jrails:install:javascripts
Com isto podemos começar a brincar com os plugins do jQuery, para utilizar o plugin suggest, basta fazer o download dele, colocar o css na pasta public/stylesheets e o js na pasta public/javascripts da aplicação …
Ai vamos editar o layout padrão da aplicação, e ter certeza de que ele inclui as seguintes linhas:
1 2 3 | <%= stylesheet_link_tag 'jquery.suggest.css' %> <%= javascript_include_tag :defaults %> <%= javascript_include_tag "jquery.suggest.js" %> |
Depois disto, em qualquer formulário, para ativar o suggest, basta colocar um text_field padrão do rails com o seguinte código (este bloco veio de dentro de um form_for):
1 | <%= inf.text_field :name, :onfocus => "$(this).suggest('#{formatted_examples_url(:js)}')", :index => nil %> |
assim, o suggest vai ser ativado para este campo quando o usuário entrar no campo, independente de se ja existe outro campo com o mesmo ID (sim, eu sei que não deveriam existir objetos com o mesmo ID, mas neste caso não tenho muito como evitar isto … )
Agora no controller …
Tenho o controller examples mapeado como um resource padrão no rails, e editei o método index dele para ficar parecido com isto:
1 2 3 4 5 6 7 8 9 | def index @examples = Example.paginate :page => params[:page], :conditions => ["name like ?","%#{params[:q]}%"] respond_to do |format| format.html # index.html.erb format.xml { render :xml => @examples } format.js end end |
basicamente a única alteração do controller padrão foi adicionar a linha format.js e adicionei a condition para filtrar a consulta …
depois disto criei o arquivo “index.js.erb” com o seguinte conteúdo (sim, eu podia fazer um render :inline mas não gosto muito da idéia
)
1 | <%= @examples.collect(&:name).join("\n") %> |
fazendo com que o resultado desta action quando chamada com a extensão “js” fosse apenas uma listagem com um nome por linha …
PS.: cada vez eu acho o jQuery mais legal de trabalhar, to curtindo mais ele do que o prototype.
Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!
Tags: autocomplete, jquery, rails, Ruby
Muito interessante. Sempre preferi usar o JQuery ao invés do prototype, e agora que estou começando com rails vou dar uma olhada nesse plugin.
Reply to this comment[...] Simplicação de código no uso do Rails ao invés do Prototype por Urubatan [...]
Reply to this commentUrubatan, o que tem no helper formatted_examples_url(:js) ?
Abraço!
Reply to this commentÉ um helper padrão de rotas nomeadas REST do rails 2.x+
Reply to this commentneste caso ele só vai renderizar a URL /examples.js
Otimo.
Reply to this commentpara fazer com o prototype dava uma cançeira danada.
vou tentar com JQuery
abraços
Nossa uma vez tentei fazer esse autocomplete com prototype.
Reply to this commentmuuuito trabalho
agora segui esse seu post O.o
funcionou de primiera
vlw
então, não tem para wordpress???
Reply to this commentna forma de plugin???