Javascript TypeAhead.js不显示任何输出轨道?
我正在尝试为我的搜索栏设置自动完成功能,这样当你键入自动完成功能时,它会向你推荐具有类似名称的帖子,这样你就不必继续键入。我在控制台中没有得到任何输出,或者在Chrome的控制台中也没有错误 我已经使用了一些教程来尝试设置它。但这是我最关注的一个: 他们都有一些相似的方法来建立这个,所以我认为这是好的。但我仍然无法让自动完成工作 当我跑步时:Javascript TypeAhead.js不显示任何输出轨道?,javascript,ruby-on-rails,autocomplete,typeahead.js,Javascript,Ruby On Rails,Autocomplete,Typeahead.js,我正在尝试为我的搜索栏设置自动完成功能,这样当你键入自动完成功能时,它会向你推荐具有类似名称的帖子,这样你就不必继续键入。我在控制台中没有得到任何输出,或者在Chrome的控制台中也没有错误 我已经使用了一些教程来尝试设置它。但这是我最关注的一个: 他们都有一些相似的方法来建立这个,所以我认为这是好的。但我仍然无法让自动完成工作 当我跑步时: bundle exec rake routes 我得到了这个,这使它看起来好像没有自动完成路径,但它应该有一个,因为我在我的清单_control
bundle exec rake routes
我得到了这个,这使它看起来好像没有自动完成路径,但它应该有一个,因为我在我的清单_controller.rb中创建了自动完成方法,不是吗
like_listing_comment PUT /listings/:listing_id/comments/:id/like(.:format) comments#upvote
unlike_listing_comment PUT /listings/:listing_id/comments/:id/unlike(.:format) comments#downvote
listing_comments GET /listings/:listing_id/comments(.:format) comments#index
POST /listings/:listing_id/comments(.:format) comments#create
new_listing_comment GET /listings/:listing_id/comments/new(.:format) comments#new
edit_listing_comment GET /listings/:listing_id/comments/:id/edit(.:format) comments#edit
listing_comment GET /listings/:listing_id/comments/:id(.:format) comments#show
PATCH /listings/:listing_id/comments/:id(.:format) comments#update
PUT /listings/:listing_id/comments/:id(.:format) comments#update
DELETE /listings/:listing_id/comments/:id(.:format) comments#destroy
like_listing PUT /listings/:id/like(.:format) listings#upvote
unlike_listing PUT /listings/:id/unlike(.:format) listings#downvote
search_listings GET /listings/search(.:format) listings#search
autocomplete_listings GET /listings/autocomplete(.:format) listings#autocomplete
listings GET /listings(.:format) listings#index
POST /listings(.:format) listings#create
new_listing GET /listings/new(.:format) listings#new
edit_listing GET /listings/:id/edit(.:format) listings#edit
listing GET /listings/:id(.:format) listings#show
PATCH /listings/:id(.:format) listings#update
PUT /listings/:id(.:format) listings#update
DELETE /listings/:id(.:format) listings#destroy
routes.rb
resources :listings do
resources :comments do
member do
put "like" => "comments#upvote"
put "unlike" => "comments#downvote"
end
end
member do
put "like" => "listings#upvote"
put "unlike" => "listings#downvote"
end
collection do
get 'search'
get :autocomplete
end
结束
在我的listings_controller.rb中的autocomplete方法中,您会注意到我将我的查询命名为search,而不是示例中的query,因为我的搜索栏名为search,它的查询也是这样命名的
def search
if params[:search]
@listings = Listing.search(params[:search])
else
@listings = Listing.all
end
end
def autocomplete
render json: Listing.search(params[:search], autocomplete: false, limit: 10).map do |listing|
{ title: listing.title, value: listing.id }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_listing
@listing = Listing.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def listing_params
params.require(:listing).permit(:name, :code, :language, :private)
end
我不太清楚它为什么不起作用,有人能看一下吗?我觉得我遗漏了一些东西,可能是我使用的教程遗漏了一些东西
编辑:我在一篇帖子中发现,有人试图访问他们的自动完成链接,并且该链接在他们的网页上返回JSON。然而,我的不是。当我尝试访问时:我应该得到一个包含很多内容的json文本,因为我有很多名为Untitled的列表
但我的控制台显示了一个很长的错误:
2016-04-16 20:08:22-0500:HTTP解析错误,请求格式错误():#
2016-04-16 20:08:22-0500:ENV:{“rack.version”=>[1,3],“rack.errors”=>>,“rack.multithread”=>true,“rack.multiprocess”=>false,“rack.run\u once”=>false,“SCRIPT\u NAME”=>,“QUERY\u STRING”=>,“SERVER\u协议”=>“HTTP/1.1”,“服务器\u软件”=>“3.1.0”,“网关\u接口”=>“CGI/1.2”,“请求\u方法”=>,“获取路径”=>,“请求自动完成”
listings.js,我已将word books更改为listings,并尝试将以下行更改为url:“../listings/autocomplete?query=%query”url:“../listings/autocomplete?search=%search”、“../listings/autocomplete?search=%query”、“../listings/autocomplete?query=%search”,这些都不起作用
var ready;
ready = function() {
var engine = new Bloodhound({
datumTokenizer: function(d) {
console.log(d);
return Bloodhound.tokenizers.whitespace(d.title);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '../listings/autocomplete?query=%QUERY'
}
});
var promise = engine.initialize();
promise
.done(function() { console.log('success })
.fail(function() { console.log('err });
$('.typeahead').typeahead(null, {
name: 'engine',
displayKey: 'title',
source: engine.ttAdapter()
});
}
$(document).ready(ready);
$(document).on('page:load', ready);
编辑:
我认为javascript可能有问题,在Atom文本编辑器中,它在这一部分强调了成功:
promise
.done(function() { console.log('success })
.fail(function() { console.log('err });
我尝试将其更改为:
promise
.done(function() { console.log('success' });
.fail(function() { console.log('err' });
但问题依然存在,我对javascript不太了解,但这行代码只应该将成功或错误打印到控制台,对吗?没有其他内容,所以它不应该影响任何内容?url名称不应该有2个点
url: '../listings/autocomplete?query=%QUERY'
应该是
url: '/listings/autocomplete?query=%QUERY'
教程附带的示例应用程序:
谢谢,我刚才更改了,但它仍然没有修复。但是您现在是否至少看到了一个错误,您可以在日志的rails侧看到它?而不是rails侧,但是JavaScript控制台会这样说:Uncaught SyntaxError:意外的令牌非法列表。self-dee8fe3a82ff5baf0f3f6798fbc8b218c218df712487fda9f30263fc24d64a0a.js:18再次检查您是否删除了一些右括号。在您发布的代码中,括号是不平衡的。当然我看不出第18行是什么。你以前用过typeahead吗?你确定你需要这些功能吗(初始化,ttadapter?)如果你不需要,我可以给你一个更简单的演练。不,我从来没有用过:/I我只是想要它,这样用户就可以在键入他可能喜欢的列表时获得建议。我真的不知道所有这些特性都做了什么,我从教程中获取了代码。大多数教程都说你必须具备所有这些。这是第17-19行promise.done(function(){console.log('success}.).fail(function(){console.log('err}));我确实看到它是不平衡的,我在上面的一次编辑中提到了这一点,但更改它似乎也无法修复它。