代码之家  ›  专栏  ›  技术社区  ›  rnjai

Searchkick+Bloodhound+Typeahead自动完成

  •  4
  • rnjai  · 技术社区  · 10 年前

    我正在尝试实现 简单的自动完成功能 对于单个属性。

    型号:

    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"] 
    

    现在添加搜索框。

    _标题.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控制台上也没有显示任何错误。

    1 回复  |  直到 10 年前
        1
  •  5
  •   Sharvy Ahmed    10 年前

    您需要返回哈希以响应自动完成操作:

    def autocomplete
      render json: Doctor.search(params[:query], autocomplete: true, limit: 10).map {|doctor| {name: doctor.name, value: doctor.id}}
    end