Início > ruby on rails, Uncategorized > Busca Dinamica AJAX + Ruby on Rails

Busca Dinamica AJAX + Ruby on Rails

Opa hoje vou falar de um assunto super eficaz uma busca onde onde vc vai digitando e ele vai filtrando as infomacoes para você
vamos la então
vamos começar criando um arquivo na sua view bem simples chamado busca_index.erb
vamos criar uma routs
projeto/config/routes.rb
o nome da minha tabela eh produtos dai fica algo assiminfomacoes


ActionController::Routing::Routes.draw do |map|

  map.resources :produtos, :collection => {:busca_index => :get};

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

dai vamos criar um method no nosso controller

app/controllers/produtos_controller.rb

def busca_index
 @produtos = CompraProduto.find(:all, :conditions => ["produto LIKE ?","%#{params[:busca]}%"])
end

agora vamos editar nossa view index busca_index
primeiro nossa index
vamos dar uma limpada e deixar somente o form da busca
algo tipo

<h1>Listing compra_produtos</h1>
 <%form_tag busca_index_produtos_path, :method => "get" do%>
 <input id="busca" name="busca" type="text" onKeyUp="pesquisa(this.value)"/>
 <%=submit_tag "Buscar"%>
 <% end %>

criei uma input html mesmo usando uma função javascript (OnKeyUp)
agora que vem a parte mais interessante
nessa view mesmo vamos criar um tag script para por nosso javascript e nosso ajax
vamos la, vai ficar algo assim.

<script>

function pesquisa(valor)

{

//FUNÇÃO QUE MONTA A URL E CHAMA A FUNÇÃO AJAX
//aqui ele vai montando a busca
url="/compra_produtos/busca_index?busca="+valor+"&commit=Buscar";

ajax(url);

}

function ajax(url)

{

//alert(nick);

//alert(dest);

//alert(msg);

req = null;

// Procura por um objeto nativo (Mozilla/Safari)

if (window.XMLHttpRequest) {

req = new XMLHttpRequest();

req.onreadystatechange = processReqChange;

req.open("GET",url,true);

req.send(null);

// Procura por uma versão ActiveX (IE)

} else if (window.ActiveXObject) {

req = new ActiveXObject("Microsoft.XMLHTTP");

if (req) {

req.onreadystatechange = processReqChange;

req.open("GET",url,true);

req.send();

}

}

}

function processReqChange()

{

// apenas quando o estado for "completado"

if (req.readyState == 4) {

// apenas se o servidor retornar "OK"

if (req.status ==200) {

// procura pela div id="pagina" e insere o conteudo

// retornado nela, como texto HTML

document.getElementById('pagina').innerHTML = req.responseText;

} else {

alert("Houve um problema ao obter os dados:n" + req.statusText);

}

}

}
</script>

agora vamos mexer no nosso arquvo busca_index


<table>
 <tr>
 <th>Compra</th>
 <th>Produto</th>
 <th>Valor</th>
 </tr>

<% for compra_produto in produtos %>
 <tr>
 <td><%=h compra_produto.compra_id %></td>
 <td><%=h compra_produto.produto %></td>
 <td><%=h compra_produto.valor %></td>
 <td><%= link_to 'Show', compra_produto %></td>
 <td><%= link_to 'Edit', edit_compra_produto_path(compra_produto) %></td>
 <td><%= link_to 'Destroy', compra_produto, :confirm => 'Are you sure?', :method => :delete %></td>
 </tr>
<% end %>
</table>

bem secao heheh e para finalizar adcinar na view index a div pagina assim

<h1>Listing compra_produtos</h1>
 <%form_tag busca_index_compra_produtos_path, :method => "get" do%>
 <input id="busca" name="busca" type="text" onKeyUp="pesquisa(this.value)"/>

 <%=submit_tag "Buscar"%>

 <% end %>

<div id="pagina">
</div>

<script>

function pesquisa(valor)

{

//FUNÇÃO QUE MONTA A URL E CHAMA A FUNÇÃO AJAX

url="/compra_produtos/busca_index?busca="+valor+"&commit=Buscar";

ajax(url);

}

function ajax(url)

{

//alert(nick);

//alert(dest);

//alert(msg);

req = null;

// Procura por um objeto nativo (Mozilla/Safari)

if (window.XMLHttpRequest) {

req = new XMLHttpRequest();

req.onreadystatechange = processReqChange;

req.open("GET",url,true);

req.send(null);

// Procura por uma versão ActiveX (IE)

} else if (window.ActiveXObject) {

req = new ActiveXObject("Microsoft.XMLHTTP");

if (req) {

req.onreadystatechange = processReqChange;

req.open("GET",url,true);

req.send();

}

}

}

function processReqChange()

{

// apenas quando o estado for "completado"

if (req.readyState == 4) {

// apenas se o servidor retornar "OK"

if (req.status ==200) {

// procura pela div id="pagina" e insere o conteudo

// retornado nela, como texto HTML

document.getElementById('pagina').innerHTML = req.responseText;

} else {

alert("Houve um problema ao obter os dados:n" + req.statusText);

}

}

}
</script>

e ta pronto desculpem a falta de detalhes mas qualquer duvida só postar ai beleza, valeu galera ate a próxima abraco
>>>> DRY >>>

  1. Douglas Reck
    dezembro 7, 2011 às 6:16 pm | #1

    Meu amigo, até que enfim achei algo simples e funcional…Parabéns.

    • dezembro 7, 2011 às 11:04 pm | #2

      que bom velho qualquer duvida posta ai, eu coloquei um spinner tb fico muito bom.

  1. janeiro 2, 2011 às 5:53 pm | #1

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.