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 …
Tudo pronto, autocomplete funcionando ![]()
Achei mais simples do que o plugin padrão do rails para autocomplete
PS.: cada vez eu acho o jQuery mais legal de trabalhar, to curtindo mais ele do que o prototype.
If you enjoyed this post, make sure you subscribe to my RSS feed!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.
[...] Simplicação de código no uso do Rails ao invés do Prototype por Urubatan [...]
Urubatan, o que tem no helper formatted_examples_url(:js) ?
Abraço!
É um helper padrão de rotas nomeadas REST do rails 2.x+
neste caso ele só vai renderizar a URL /examples.js
Otimo.
para fazer com o prototype dava uma cançeira danada.
vou tentar com JQuery
abraços
Nossa uma vez tentei fazer esse autocomplete com prototype.
muuuito trabalho
agora segui esse seu post O.o
funcionou de primiera
vlw
então, não tem para wordpress???
na forma de plugin???
Sou iniciante em Rails e gostaria de saber como pegar o conteúdo gerado por uma def e usá-lo como fonte de dados para o suggest?
Por exemplo, no meu controller eu criar:
def suggest
end
e pegar o conteúdo gerado para passar como fnte de dados para o autocomplete.
Obrigado
Fábio,
é exatamente isto que este exemplo faz, só que em vez da renderização estar dentro do código Ruby, foi utilizado um arquivo externo .js.erb para renderizar o conteúdo pro suggest …
Maneiro era o que estava procurando =D
abraço
Cara…
Gostei dessa…
Melhor mesmo q o prototype…
Só q ja fiz o projeto inteiro em prototype, sei q posso usar os dois…
Mas vou ter q carregar mais um .js….
Vai ficar apesado !
Blz Urubatan?
Estou com dificuldade para implementar o codigo acima.
Nao entendi a seguinte parte
“$(this).suggest(‘#{formatted_examples_url(:js)}’)”, :index => nil %>
O que seria o formatted_examples_url(:js) ?
Vlw
formatted_examples_url é uma chamada do rails que retorna a URL para o controller “examples” para o content type especificado, neste caso javascript.
mas se não me engano este método vai deixar de existir no rails 3.0