正在使用twitter-typeahead示例?

时间:2015-01-23 02:33:51

标签: javascript ruby-on-rails ruby ruby-on-rails-4 twitter-typeahead

我试图将twitter-typeahead-rails gem安装到我的应用中。我已经关注了几个不同的教程,但所有教程都会导致错误。

有没有人有这个宝石的实际例子?

2 个答案:

答案 0 :(得分:9)

Gemfile

中指定gem作为依赖项
# Gemfile

gem 'bootstrap-multiselect-rails'

清单中需要预先输入文件:

// app/assets/javascripts/application.js

//= require twitter/typeahead
//= require twitter/typeahead/bloodhound

使用Javascript:

// app/assets/javascripts/models_controller.js

// initialize bloodhound engine
var bloodhound = new Bloodhound({
  datumTokenizer: function (d) {
    return Bloodhound.tokenizers.whitespace(d.value);
  },
  queryTokenizer: Bloodhound.tokenizers.whitespace,

  // sends ajax request to /typeahead/%QUERY
  // where %QUERY is user input
  remote: '/typeahead/%QUERY', 
  limit: 50
});
bloodhound.initialize();

// initialize typeahead widget and hook it up to bloodhound engine
// #typeahead is just a text input
$('#typeahead').typeahead(null, {
  displayKey: 'name',
  source: bloodhound.ttAdapter()
});

// this is the event that is fired when a user clicks on a suggestion
$('#typeahead').bind('typeahead:selected', function(event, datum, name) {
  doSomething(datum.id);
});

查看:

<-- app/views/models/whatever.html.erb -->

<input type="text" id="typeahead">

路线:

# config/routes.rb

get 'typeahead/:query' => 'models#typeahead'

控制器:

# app/controllers/models_controller.rb

def typeahead
  render json: Model.where(name: params[:query])
end

## note:  the above will only return exact matches.
## depending on the database being used,
## something else may be more appropriate.
## here is an example for postgres
## for case-insensitive partial matches:

def typeahead
  render json: Model.where('name ilike ?', "%#{params[:query]}%")
end

对/ typeahead /%QUERY的GET请求以以下形式返回json:

[
  {
    "name": "foo",
    "id": "1"
  },
  {
     "name": "bar",
     "id": "2"
  }
]

答案 1 :(得分:5)

接受的答案并不完全正确。

似乎有两种不同的宝石大致相同:

bootstrap-multiselect-rails目前在gem存储库中的版本0.9.9,并且具有不同的资产需求结构,如帖子中所述。这个宝石的资产需要包含在:

In application.js:
//= require bootstrap-multiselect

In application.css:
*= require bootstrap-multiselect

有关Git的更多信息:https://github.com/benjamincanac/bootstrap-multiselect-rails

或者,有twitter-typeahead-rails gem,目前版本为0.11.1,似乎需要使用并包含在接受答案的其余部分中。

有关Git的更多信息:https://github.com/yourabi/twitter-typeahead-rails

在写这篇文章的那一刻,这两颗宝石似乎都是在5-6个月前的最新更新。

最后,Bloodhound JS中指定的远程URL不正确:

remote: '/typeahead/%QUERY'

需要

remote: {url: '/typeahead/%QUERY', wildcard: '%QUERY'}

希望这有助于某人