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
我正在使用 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