Ruby on rails Twitter Typeahed 0.11.1只显示一个结果

Ruby on rails Twitter Typeahed 0.11.1只显示一个结果,ruby-on-rails,autocomplete,typeahead,bloodhound,searchkick,Ruby On Rails,Autocomplete,Typeahead,Bloodhound,Searchkick,我正在尝试使用searchkick在我的数据库中查找一个人。当用户从下拉列表中选择该人员时,它会将该人员的id放在隐藏字段中,这是提交的值 那部分很好(大部分) 我遇到的问题是,如果结果少于五个,typeahead在下拉列表中只显示一个值(searchkick返回的第一个值)。如果结果超过五个,则下拉列表不会显示 这是我的个人模型: searchkick text_start: [:first_name, :middle_name, :last_name] def search_data

我正在尝试使用searchkick在我的数据库中查找一个人。当用户从下拉列表中选择该人员时,它会将该人员的id放在隐藏字段中,这是提交的值

那部分很好(大部分)

我遇到的问题是,如果结果少于五个,typeahead在下拉列表中只显示一个值(searchkick返回的第一个值)。如果结果超过五个,则下拉列表不会显示

这是我的个人模型:

searchkick text_start: [:first_name, :middle_name, :last_name]

def search_data
  as_json only: [:first_name, :last_name, :middle_name, :active]
end

def full_name
  "#{first_name} #{middle_name} #{last_name}"
end
我的人事控制员:

def person_search
  render json: Person.search(params[:query],
  fields: [{first_name: :text_start}, {last_name: :text_start}, {middle_name: :text_start}],
  where:{active:true},
  limit: 5).map {|person| {name: person.full_name, value: person.id}}
end
我的表单视图:

<%= simple_form_for(@person) do |f| %>
  <% if @person %>
    <%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', value: @person.full_name}  %>
  <% else %>
    <%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', placeholder: "No Person Selected"}  %>
  <% end %>

  <%= f.input :person_id, as: :hidden%>

<% end %>
如果有人能更好地向我解释一下《猎犬》(tokenizers和identification函数的功能)也会有所帮助

我已经看了几个小时的文档了,但它没有点击

奖金问题: 假设数据库中有多个约翰

  • 约翰·史密斯
  • 无名氏
  • 约翰斯诺
当我搜索John(这是在0.10)时,下拉列表显示了所有三个,但当我按空格并开始键入姓氏时,searchkick不会返回任何结果,所有结果都会消失。
有没有办法用Searchkick做到这一点?

这似乎是typeahead的问题。我在这里找到了解决方案:

我做了这件事,那件事帮我解决了:

var ready;
ready = function() {
  var people = new Bloodhound({
    identify: function(obj) { return obj.value;},
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
      url: '/people/person_search?query=%QUERY',
      wildcard: '%QUERY'
    }
  });
  $('.person-typeahead').typeahead(null, {
    display: 'name',
    source: people
  }).on('typeahead:selected', onPersonSelected);
  // show name and submit id
  function onPersonSelected($e, datum) {
  $('#person_id').val(datum.value);

}
};

$(document).ready(ready);
$(document).on('page:load', ready);