Searchkick + Bloodhound + Typeahead 自动完成
Searchkick + Bloodhound + Typeahead for autocomplete
我正在尝试为单个属性实现简单的自动完成功能。
型号:
searchkick text_start: [:name],autocomplete: ['name']
重新索引后 Rails 控制台上的行为正常。
2.2.0-p0 :002 >Doctor.search("a", autocomplete: true).map(&:name)
gives the output-
=> ["a", "aa", "aaa", "aaaa"]
在此之后,我向控制器添加了自动完成操作,并向 routes.rb 文件添加了一条新路径。
控制器:
def autocomplete
console.log("In auto")
render json: Doctor.search(params[:query], autocomplete: false, limit: 10).map(&:name)
end
路线:
resources :doctors do
collection do
get :autocomplete
end
end
此时如果我简单地测试以下 URL:
http://localhost:3000/doctors/autocomplete?query="a"
然后我在浏览器中得到了预期的结果:
["a", "aa", "aaa", "aaaa"]
正在添加搜索框。
_header.html.erb:
<%= form_tag doctors_path, method: :get do %>
<div class="form-group">
<%= text_field_tag :query, params[:query], class: 'form-control typeahead', autocomplete: "off" %>
<%= submit_tag 'Search', class: 'btn btn-primary' %>
</div>
<% end %>
最后 Javascript:
var ready;
ready = function() {
var numbers = new Bloodhound({
remote: {url: "/doctors/autocomplete?query=%QUERY"},
datumTokenizer: function(d) {
return Bloodhound.tokenizers.whitespace(d.name); },
queryTokenizer: Bloodhound.tokenizers.whitespace
});
// initialize the bloodhound suggestion engine
var promise = numbers.initialize();
promise
.done(function() { console.log('success!'); })
.fail(function() { console.log('err!'); });
// instantiate the typeahead UI
$( '.typeahead').typeahead(null, {
displayKey: 'name',
source: numbers.ttAdapter()
});
}
$(document).ready(ready);
$(document).on('page:load', ready);
这是使用的脚本标签:
<script type="text/javascript" src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>
输入任何内容时搜索框没有显示任何响应,Google Chrome 的控制台上也没有显示错误。
您需要 return 散列以响应您的自动完成操作:
def autocomplete
render json: Doctor.search(params[:query], autocomplete: true, limit: 10).map {|doctor| {name: doctor.name, value: doctor.id}}
end
我正在尝试为单个属性实现简单的自动完成功能。
型号:
searchkick text_start: [:name],autocomplete: ['name']
重新索引后 Rails 控制台上的行为正常。
2.2.0-p0 :002 >Doctor.search("a", autocomplete: true).map(&:name)
gives the output-
=> ["a", "aa", "aaa", "aaaa"]
在此之后,我向控制器添加了自动完成操作,并向 routes.rb 文件添加了一条新路径。
控制器:
def autocomplete
console.log("In auto")
render json: Doctor.search(params[:query], autocomplete: false, limit: 10).map(&:name)
end
路线:
resources :doctors do
collection do
get :autocomplete
end
end
此时如果我简单地测试以下 URL:
http://localhost:3000/doctors/autocomplete?query="a"
然后我在浏览器中得到了预期的结果:
["a", "aa", "aaa", "aaaa"]
正在添加搜索框。
_header.html.erb:
<%= form_tag doctors_path, method: :get do %>
<div class="form-group">
<%= text_field_tag :query, params[:query], class: 'form-control typeahead', autocomplete: "off" %>
<%= submit_tag 'Search', class: 'btn btn-primary' %>
</div>
<% end %>
最后 Javascript:
var ready;
ready = function() {
var numbers = new Bloodhound({
remote: {url: "/doctors/autocomplete?query=%QUERY"},
datumTokenizer: function(d) {
return Bloodhound.tokenizers.whitespace(d.name); },
queryTokenizer: Bloodhound.tokenizers.whitespace
});
// initialize the bloodhound suggestion engine
var promise = numbers.initialize();
promise
.done(function() { console.log('success!'); })
.fail(function() { console.log('err!'); });
// instantiate the typeahead UI
$( '.typeahead').typeahead(null, {
displayKey: 'name',
source: numbers.ttAdapter()
});
}
$(document).ready(ready);
$(document).on('page:load', ready);
这是使用的脚本标签:
<script type="text/javascript" src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>
输入任何内容时搜索框没有显示任何响应,Google Chrome 的控制台上也没有显示错误。
您需要 return 散列以响应您的自动完成操作:
def autocomplete
render json: Doctor.search(params[:query], autocomplete: true, limit: 10).map {|doctor| {name: doctor.name, value: doctor.id}}
end