thực hiện đầy đủ của nhiều lĩnh vực autocomplete:
Tiếp theo nhận xét của tôi, giải pháp của tôi để hòa nhập vào jquery-autocomplete là để có một thực hiện tùy chỉnh của autocomplete "nội bộ".
1. Truy vấn cơ sở dữ liệu
Nếu bạn đang sử dụng ActiveRecord, bạn có thể sử dụng giải pháp DGM cho named_scope bạn
Nếu bạn đang sử dụng Mongoid, bạn có thể sử dụng cú pháp này để thay thế:
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: nếu bạn muốn tự động điền mạnh hơn có thể xử lý dấu trọng âm, phần văn bản phù hợp, v.v. bạn nên thử chỉ mục văn bản mongoid.Tín dụng cho the original answer there
index(first_name: 'text', last_name: 'text')
scope :by_name, ->(str) {
where(:$text => { :$search => str })
}
Và đừng quên để xây dựng các chỉ số sau khi thêm rằng rake db:mongoid:create_indexes
Vì vậy, về cơ bản bạn có thể làm User.by_name(something)
2. Tạo một hành động tự động hoàn trong điều khiển của bạn
Bởi vì cái được cung cấp bởi jquery-autocomplete ... sẽ không làm những gì chúng ta muốn.
Lưu ý rằng bạn sẽ phải chuyển đổi kết quả thành JSON để nó có thể được sử dụng trong giao diện người dùng tự động điền. Đối với điều này tôi đã chọn để sử dụng đá quý ActiveModel :: Serializer, nhưng cảm thấy tự do sử dụng cái gì khác nếu bạn thích, và bỏ qua bước 3
Trong điều khiển của bạn:
def autocomplete
@users = User.by_name(params[:term])
render json: @users, root: false, each_serializer: AutocompleteSerializer
end
3. Định dạng lại các phản ứng
serializer của bạn bằng cách sử dụng đá quý activemodel:
tôi cung cấp các liên kết đến phiên bản 0.9, là master
trang chính không chứa tài liệu đầy đủ.
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. Tạo một lộ trình cho autocompletion bạn
Trong các tuyến đường của bạn:
get '/users/autocomplete', to: 'users#autocomplete', as: 'autocomplete_user'
5. Hãy vui vẻ trong quan điểm của bạn
Cuối cùng trong quan điểm của bạn bạn có thể sử dụng cú pháp mặc định của jquery-rails, nhưng hãy nhớ rằng chang e con đường!
<%= form_tag '' do
autocomplete_field_tag 'Name', '', autocomplete_user_path, :id_element => "#{your_id}", class: "form-control"
end %>
RQ: Tôi sử dụng một số 2 cấp hình thức lồng nhau sâu, vì vậy nó là một chút khó khăn để có được những yếu tố id đúng your_id
. Trong trường hợp của tôi, tôi phải làm điều gì đó phức tạp, nhưng rất có thể nó sẽ đơn giản cho bạn. Bạn luôn có thể có một cái nhìn tại DOM tạo ra để lấy ID lĩnh vực
Đá quý được duy trì là [ở đây] (https://github.com/bigtunacan/rails-jquery-autocomplete) –