Полная реализация автозаполнения с несколькими полями:
После моего комментария мое решение для интеграции в jquery-autocomplete состояло в том, чтобы иметь собственную реализацию "внутреннее автозаполнение.
1.Запрос к базе данных
Если вы используете ActiveRecord, вы можете использовать решение DGM для вашего named_scope
Если вы используете Mongoid, вы можете использовать вместо этого следующий синтаксис:
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])
}
РЕДАКТИРОВАТЬ : если вы хотите более сильное автозаполнение, которое может обрабатывать акценты, соответствующие части текста и т. Д .;Вы должны попробовать mongoid текстовый индекс.Кредиты на оригинальный ответ там
index(first_name: 'text', last_name: 'text')
scope :by_name, ->(str) {
where(:$text => { :$search => str })
}
И не забудьте построить индексы после добавления этого rake db:mongoid:create_indexes
Так что вы можете в основном сделать User.by_name(something)
2.Создайте действие автозаполнения в вашем контроллере
Потому что тот, который предоставляется jquery-autocomplete ... не будет делать то, что мы хотим.
Обратите внимание, что вам придется преобразовать результат в JSON, чтобы его можно было использовать в веб-интерфейсе jquery-autocomplete.Для этого я решил использовать gem ActiveModel :: Serializer, но не стесняйтесь использовать что-то другое, если хотите, и пропустите шаг 3
В вашем контроллере:
def autocomplete
@users = User.by_name(params[:term])
render json: @users, root: false, each_serializer: AutocompleteSerializer
end
3.Переформатируйте ответ
Ваш сериализатор, используя гем activemodel :
Я предоставил ссылку на версию 0.9, поскольку главная страница master
нене содержит полную документацию.
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.Создайте маршрут для автодополнения
В ваших маршрутах:
get '/users/autocomplete', to: 'users#autocomplete', as: 'autocomplete_user'
5.Получайте удовольствие от ваших представлений
Наконец, в ваших представлениях вы можете использовать синтаксис по умолчанию jquery-rails, но не забудьте изменить путь!
<%= form_tag '' do
autocomplete_field_tag 'Name', '', autocomplete_user_path, :id_element => "#{your_id}", class: "form-control"
end %>
RQ: Я использовал несколькоДвухуровневые глубоко вложенные формы, поэтому было немного сложно получить правильный элемент id your_id
.В моем случае мне пришлось сделать что-то сложное, но, скорее всего, это будет просто для вас.Вы всегда можете взглянуть на сгенерированный DOM, чтобы получить идентификатор поля