Полная реализация множественного поля автозаполнения:
После моего комментария, мое решение интегрировать в Jquery-автозаполнения должен был иметь пользовательский реализации «внутреннего» автозаполнения.
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])
}
EDIT: если вам нужен более сильный автозаполнение, которое может обрабатывать акценты, соответствующие части текста и т. Д .; вы должны попробовать текстовый индекс mongoid.Кредиты the original answer there
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-автозаполнении. Для этого я решил использовать драгоценный камень 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: Я использовал несколько глубоких вложенных форм 2 уровня, так что это было немного сложнее, чтобы получить правильный элемент ID your_id
. В моем случае мне пришлось сделать что-то сложное, но, скорее всего, это будет просто для вас. Вы всегда можете посмотреть на сгенерированный DOM для извлечения поля ID
обслуживаемого камень [здесь] (https://github.com/bigtunacan/rails-jquery-autocomplete) –