Rails 和 typeahead.js - 400(错误请求)

Rails with typeahead.js - 400 (Bad Request)

我正在使用 Searchkick gem 和 typeahead.js 为我的搜索输入整合自动完成功能。按照 gem 的 tutorial,我已经按照指示成功设置了我的模型、控制器和路线:

餐厅模特

class Restaurant < ActiveRecord::Base
  searchkick text_start: [:name], autocomplete: [:name], suggest: [:name]

  def search_data
    { name: name }
  end
end

搜索控制器

class SearchController < ApplicationController
  def index
    if params[:query].present?
      @restaurants = Restaurant.search(params[:query], suggest: true)
    else
      @restaurants = []
    end
  end

  def autocomplete
    render json: Restaurant.search(params[:query], autocomplete: true, limit: 10).map(&:name)
  end
end

路线

resources :search, :only => [:index] do
  member do
    get :autocomplete
  end
end

部分搜索

<%= form_tag search_index_path, method: :get do |f| %>
    <%= text_field_tag :query, params[:query], id: "autocomplete" %>
    <%= submit_tag "Search" %>
<% end %>

我感觉是 JS 给我带来了麻烦。我松散地关注 gem 页面上的 docs 和一些 SO 帖子,这就是我最终得到的:

$(function() {
  var restaurants = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('restaurant'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: { "url":"/search/autocomplete?query=%QUERY" }
  });

  restaurants.initialize();

  $('#autocomplete').typeahead(null, {
    displayKey: 'name',
    source: numbers.ttAdapter()
  });
});

注意这行:

remote: { "url":"/search/autocomplete?query=%QUERY" }

回到视图,当我开始在我的输入框中输入时,我得到这个错误:

GET http://localhost:3000/search/autocomplete?query=%QUERY 400 (Bad Request)

此外,我在控制台中收到此错误:

ERROR bad URI `/search/autocomplete?query=%QUERY'.

QUERY 没有被插值。我该如何解决这个问题?

var restaurants = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('restaurant'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: { 
        url: "/search/autocomplete?query=%QUERY",
        wildcard: "%QUERY"
    }
});

您可能还想修复您的控制器,使其 returns 成为空 ActiveRecord::Relation 对象而不是空数组。

def index
   if params[:query].present?
     @restaurants = Restaurant.search(params[:query], suggest: true)
   end
   @restaurants ||= Restaurant.none
end

http://apidock.com/rails/ActiveRecord/QueryMethods/none