2015-11-10 112 views
0

我正在使用Searchkick gem和typeahead.js將搜索輸入的自動完成功能放在一起。繼創業板的tutorial我設法讓我的模型,控制器和路由設置的指示:Rails with typeahead.js - 400(Bad Request)

餐廳型號

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。我鬆散繼創業板的頁面上docs而一些職位,這是我結束了:

$(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沒有被插入。我該如何解決?

+0

你得到不好的URI,因爲你的路線是無效的。你應該使用'collection'而不是'member'。 'member'會產生一個看起來像'/ search /:id/autocomplete'的路徑 – AbM

+0

@AbM還有什麼我需要做的,因爲它在將'member'改爲'collection'後仍然給我同樣的錯誤。 –

+0

如果有幫助,這是如何解釋路由:'autocomplete_search_index GET/search/autocomplete(。:format)' –

回答

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

您可能還需要修復您的控制器,它返回一個空的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