2011-09-29 11 views
7

He creado un formulario que suministra criterios de búsqueda:Meta búsqueda o Ransack con Geocoder

= search_form_for @q do |f| 
    %h3 
    Search: 
    = f.label :category_id 
    %br 
    = f.collection_select :category_id_eq, Category.all, :id, :name, :include_blank => true 
    %br 
    = f.label "Sub-Category" 
    %br 
    = f.collection_select :subcategory_id_eq, Subcategory.all, :id, :name, :include_blank => true, :prompt => "select category!" 
    %br 
    = f.label "Contains" 
    %br 
    = f.text_field :title_or_details_cont 
    %br 
    = f.submit 

Quiero ser capaz de hacer también una búsqueda basada en la funcionalidad "Cerca" de la gema Rails Geocoder . ¿Alguien sabe cómo incorporar un alcance existente, o específicamente cómo usar el alcance "Cercano" con Meta Search o Ransack?

Hasta ahora, todos mis intentos han sido inútiles.

Respuesta

8

Esto es bastante fácil de conseguir simplemente agregando un campo que no sea search_form_for dentro de tu formulario.

En mi opinión (nótese la diferencia en los dos campos de formulario):

<%= search_form_for @search do |f| %> 
    <%= f.label :will_teach, "Will Teach" %> 
    <%= f.check_box :will_teach %> 

    <%= label_tag :within %> 
    <%= text_field_tag :within, params[:within], {:class => "span1"} %> miles 
<% end %> 

Esto produce entonces una cadena de parámetro como la siguiente:

Parameters: {"utf8"=>"✓", "q"=>{"will_teach"=>"1"}, "within"=>"10", "commit"=>"Search"} 

entonces usted puede poner un poco de lógica condicional en su controlador para aspirar estos params y combinar Geocoder con Ransack. Compruebo para ver si el parámetro "dentro" está presente, si es así, compruebe que es un número (to_i devuelve 0 para cualquier cosa que no sea un número, por lo tanto, la comprobación> 0).

Luego combino el Geocoder "cerca" con la "búsqueda" de Ransack.

Si el parámetro "dentro" no está allí (es decir, el usuario no ingresó un número), entonces busco sin los bits del Geocoder.

Finalmente estoy usando Kaminari, por lo que pasa en el final de los resultados de la búsqueda:

if params[:within].present? && (params[:within].to_i > 0) 
     @search = Tutor.near(request.location.city,params[:within]).search(params[:q]) 
    else 
     @search = Tutor.search(params[:q]) 
    end 

    @tutors = @search.result.page(params[:page]).per(9) 

Espero que esto ayude!

+2

Gracias. Esto probablemente debería ser aceptado como la respuesta. De cualquier manera, realmente me ayudó. Ejército de reserva. – Will

+0

Alguien debería aceptar esto – luisenrike

+0

@luisenrike solo han pasado cinco años: D – DaveStephens

Cuestiones relacionadas