La plena aplicación de autocompletar de varios campos:
Después de mi comentario, mi solución de integrar en jquery-autocompletar era tener una implementación personalizada de la autocompletar "interno".
1. Consulta de la base de datos
Si está utilizando ActiveRecord, puede utilizar la solución de DGM para su named_scope
Si está utilizando Mongoid, puede utilizar esta sintaxis en su lugar:
scope :by_first_name, ->(regex){
where(:first_name => /#{Regexp.escape(regex)}/i)
}
scope :by_last_name, ->(regex){
where(:last_name => /#{Regexp.escape(regex)}/i)
}
scope :by_name, ->(regex){
any_of([by_first_name(regex).selector, by_last_name(regex).selector])
}
EDIT: si desea una autocompleta más potente que pueda manejar acentos, coincidencias de partes de texto, etc. deberías probar el índice de texto mongoide.Créditos a the original answer there
index(first_name: 'text', last_name: 'text')
scope :by_name, ->(str) {
where(:$text => { :$search => str })
}
Y no se olvide de construir los índices después de añadir que rake db:mongoid:create_indexes
lo que puede hacer básicamente User.by_name(something)
2. Crear una acción de autocompletar en su controlador
Porque el proporcionado por jquery-autocomplete ... no hará lo que queremos.
Tenga en cuenta que deberá convertir el resultado a JSON para que pueda ser utilizado en el frontend jquery-autocomplete. Para esto he optado por utilizar la gema ActiveModel :: Serializador, pero no dude en utilizar algo más si lo prefiere, y omita el paso 3
En su controlador:
def autocomplete
@users = User.by_name(params[:term])
render json: @users, root: false, each_serializer: AutocompleteSerializer
end
3. Vuelva a formatear la respuesta
Su serializador usando la gema activemodel:
he proporcionado el enlace a la versión 0.9, ya que elLa página principal deno contiene la documentación completa.
class AutocompleteSerializer < ActiveModel::Serializer
attributes :id, :label, :value
def label
object.name
# Bonus : if you want a different name instead, you can define an 'autocomplete_name' method here or in your user model and use this implementation
# object.respond_to?('autocomplete_name') ? object.autocomplete_name : object.name
end
def value
object.name
end
4. Crear una ruta para su terminación automática
En sus rutas:
get '/users/autocomplete', to: 'users#autocomplete', as: 'autocomplete_user'
5. divertirse en sus puntos de vista
Por último, en sus puntos de vista puede usar la sintaxis predeterminada de jquery-rails, pero recuerde cambiar e el camino!
<%= form_tag '' do
autocomplete_field_tag 'Name', '', autocomplete_user_path, :id_element => "#{your_id}", class: "form-control"
end %>
RQ: He utilizado algunas profundas formas anidadas de 2 niveles, así que fue un poco difícil de conseguir el elemento derecha Identificación your_id
. En mi caso, tuve que hacer algo complicado, pero lo más probable es que sea simple para ti. Siempre se puede echar un vistazo a la DOM generados para recuperar el campo ID
la gema es mantenido [aquí] (https://github.com/bigtunacan/rails-jquery-autocomplete) –