2008-10-11 10 views
9

Estoy buscando la manera más fácil de cómo implementar la función "sugerir" para un campo de entrada de texto en una aplicación Rails. La idea es completar los nombres almacenados en una columna de base de datos, dando al usuario un menú desplegable de posibles coincidencias a medida que escribe."sugerir" función para cuadros de texto en una aplicación de rieles

¡Gracias por cualquier sugerencia!

Respuesta

1

EDIT: Voy a dejar esta respuesta aquí como una especie de punto de referencia teórico, pero suena como es probable que sea más útil para usted :)

Negación del autocompleter answer: Aunque trabajo para Google (que claramente tiene elementos de "Sugerir" en varias IU). No he observado ningún código en esta área, ni siquiera he hablado con nadie sobre el aspecto del lado del cliente.

El lenguaje del lado del servidor es probablemente irrelevante aquí. El bit importante es el AJAX requerido en el lado del cliente.

Le sugiero que tenga un temporizador de aproximadamente 1 segundo (experimente para encontrar un punto óptimo) que se restablece cada vez que el usuario ingresa una tecla en el cuadro de texto y cancela si el usuario navega fuera del cuadro de texto. Si el temporizador se dispara, haz que ejecute una solicitud AJAX. La solicitud de AJAX contendría lo que el usuario ha tipeado hasta ahora. La respuesta AJAX debe ser la lista de sugerencias y el texto original de la solicitud.

Si, cuando la respuesta AJAX retorna, el texto en el cuadro de texto sigue siendo el mismo que el campo en la respuesta (es decir, el usuario no ha escrito desde entonces) y si el cuadro de texto aún tiene foco, ofrezca un menú desplegable. (Debe haber cientos de páginas de ejemplo sobre comboboxes HTML para hacer este lado de las cosas).

Todo lo que el servidor necesita hacer es responder a la solicitud AJAX realizando la búsqueda y formateando la respuesta de manera apropiada, es mucho más fácil que el lado del cliente!

Espero que ayude, disculpe por no tener ningún código de muestra, pero sospecho que es bastante complicado y no soy realmente un desarrollador de JavaScript.

1

Como con la mayoría de las cosas en los rieles, existen varias formas de hacerlo. Rails solía incluir un conjunto de ayudantes de autocompletado integrados, pero esa funcionalidad ahora se ha eliminado al complemento auto_complete. Es probable que esta sea la forma más fácil de obtener lo que desea implementar: un simple comando en el controlador, algunas cosas simples en su vista, ta-dah. Para utilizar esta solución, solo deberá instalar el complemento en su aplicación; consulte this page, que le informa todo lo que necesita saber para instalarlo y comenzar.

Como se señala en otra respuesta, esta ruta hará uso del prototipo y los marcos AJAX scriptaculous que vienen incluidos con Rails. Existen otros frameworks AJAX, notablemente JQuery, que también pueden ayudarlo a lograr esta funcionalidad, pero tendrá más aprendizaje acelerado para usarlos que solo usar el plugin.

1

También puede probar este enfoque un poco más manual

# your_view.rhtml 

<%= text_field 'contact', 'name', :id => 'suggest' %> 
<div id='dropdown' style='display:none; z-index: 100; background: #FFFFFF'></div> 

<script> 
    new Ajax.Autocompleter('suggest', 'dropdown', "<%= url_for :controller => 'contacts', :action => 'suggest_name' %>") 
</script> 

# contacts_controller.rb 

def suggest_name 
    query_string = params[:contact][:name] 
    @contacts = Contact.find.all :conditions => ['name ilike ?', "%#{query_string}%"] 
    render :partial => 'name_suggestions' 
end 

# contacts/_name_suggestions.rhtml 

<ul> 
<% for contact in @contacts %> 
    <li><%= contact.name %></li> 
<% end %> 
</ul> 
8

rieles hace 'auto completado de estilo suggest' en los campos de texto muy fácil utilizando el método text_field_with_auto_complete.

En rieles 1.x este método fue construido en ActionView::Helpers::JavaScriptMacrosHelper, pero para Rails 2.x se movió a a separate plugin.

Digamos que tiene un modelo llamado Post que tiene un campo de texto llamado title. En su opinión, en las que normalmente utilizar text_field_tag (o f.text_field), sólo tiene que utilizar text_field_with_auto_complete lugar:

<%= text_field_with_auto_complete :post, :title %> 

Además, en PostsController, usted tiene que hacer una declaración correspondiente:

class PostsController < ApplicationController 
    auto_complete_for :post, :title 
end 

Lo que esto hace detrás de las escenas se agrega dinámicamente una acción llamada auto_complete_for_[object]_[method] al controlador. En el ejemplo anterior, esta acción se llamará auto_complete_for_post_title.

Vale la pena señalar que la llamada find utilizada por esta acción autogenerada actuará en todos los objetos del modelo, p. Post.find(:all, ...). Si este no es el comportamiento que desea (por ejemplo, si desea restringir la búsqueda a un subconjunto específico de Post s basado en el usuario conectado), entonces debe definir su propia acción auto_complete_for_[object]_[method] en su controlador.

Cuestiones relacionadas