December 12th, 2008 por CaDs

Hacer una búsqueda dinámica para que vayan apareciendo los resultados a medida que escribimos en el formulario es relativamente sencillo con rails.
Para ello sólo necesitamos los siguientes elementos:
Primero de todo necesitamos cargar los elementos ‘ajaxianos’ que vienen con rails. Para ello basta con incluir:


<%=  javascript_include_tag :defauts %>

Generalmente es una buena práctica incluir este tag en el layout general, pero eso depende de cada uno.

Vista:


<% form_tag 'search' do %>  
<div class="table_title">
    <table>
      <tr>
        <td>Buscar:</td>
        <td><%= text_field_tag("query", params[:query], :autocomplete => "off" ) %></td>
      </tr>
    </table>
      
</div>
<% end %>
    
    <%= observe_field 'query',  :frequency => 2,
                        :update => search_results",                
                :url => {:controller => "friends", :action => "search"},
                 :with => "query" %>

<div id="search_results">
</div>

Con esto definimos un campo de búsqueda llamado query donde iremos haciendo las búsquedas.
Adicionalmente con observe_field indicamos que debemos realizar cada cierto tiempo una búsqueda con los parámetros de query usando la acción search del controlador friends.
Y también definimos un div llamado search_results, inicialmente vacío, que será actualizado con los resultados de esa búsqueda.

Controller:


def search    
    session[:query] = params[:query].strip if params[:query]

    if session[:query] and request.xhr?
      @friends = Friend.all(:conditions => ["first_name LIKE ?", "%#{session[:query]}%"], :order => "first_name ASC")     
      render :partial => "search_results", :layout => false, :locals => {:searchresults => @friends} 
    end
  end

Donde hacemos una búsqueda con los parámetros que hemos obtenido desde nuestra vista y la presentamos en un partial llamado search_results pasándole los resultados de la búsqueda.
El código de este partial puede ser a gusto de cada uno, simplemente debe presentar los resultados.
Un ejemplo sería:


<% if searchresults.length == 0 %>
        <p>No se han encontrado resultados</p>
<% elsif params[:query] == "" %>
        <p>No hay términos de búsqueda</p>
<% else %>
<div class ="search_results">
  <strong>Amigos Encontrados:</strong>
  <table>
  <% for friend in searchresults %>     
    <tr>
      <td>
              <%=friend.last_name%>, <%=friend.first_name%>  
      </td>
    </tr>
  <% end %>
  </table>
</div>
<% end %>

Modelo:
Un modelo básico que nos serviría para este ejemplo sería algo así.


class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table (:friends,:options => 'DEFAULT CHARSET=UTF8') do |t|
      t.column :first_name, :string
      t.column :last_name, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :friends
  end
end


Y eso sería todo, ya tenemos una búsqueda dinámica en menos de 5 minutos.

Enjoy

  • Share/Bookmark

Deja un comentario