searchkick gem を使用してアプリケーションをセットアップし、Presenters インデックスのオートコンプリート機能に取り組んでいます。私の問題は、複数のフィールド (first_name と last_name) で検索していることです。両方のフィールドでプレゼンターを検索できますが、たとえば、プレゼンターが「Jennifer Hall」の場合、「Jennifer」または「Hall」と入力できます。 「Jennifer Hall」という名前がオートコンプリート ドロップダウンに表示されますが、「Jennifer」と入力すると (スペースを追加すると)、名前が消えて候補が表示されなくなります。私の質問は、どうすればこれを修正できますか?
マイコード
このチュートリアルに従いました: Elasticsearch を使用して Rails アプリに検索とオートコンプリートを追加する
プレゼンター.rb:
class Presenter < ActiveRecord::Base
searchkick autocomplete: ['first_name', 'last_name'],
suggest: ['first_name', 'last_name']
...
end
presenters_controller.rb:
class PresentersController < ApplicationController
def index
if params[:query].present?
@presenters = Presenter.search(params[:query],
fields: [:first_name, :last_name],
page: params[:page])
else
@presenters = Presenter.all.page params[:page]
end
end
def autocomplete
render json: Presenter.search(params[:query],
autocomplete: true,
fields: [:first_name, :last_name],
limit: 10).map { |presenter|
presenter.first_name + " " + presenter.last_name
}
end
...
end
.map{ |プレゼンター| を取得しました ここからのアイデア:
searchkick gem を使用してレールに複数の属性をマップする方法
ただし、ソリューションを正確に実行すると、提案された名前のドロップダウンに「未定義」しか表示されませんでした。presenter.first_name + " " + presenter.last_name に変更すると、フルネームがドロップダウンに表示されるようになりました。
ルート.rb:
resources :presenters, :only => [:index, :show] do
collection do
get :autocomplete
end
index.html.haml:
.container
= form_tag presenters_path, method: :get do
- if params[:query].present?
.btn-search.btn-clearsearch
= link_to "clear", presenters_path
- else
.search
Search
= text_field_tag :query, params[:query],
id: "presenter_search",
autocomplete: "off"
= submit_tag "go", class: "btn-search"
私は typehead.js を使用しているので、次のように動作します:
application.html.haml:
= javascript_include_tag 'application'
= javascript_include_tag
"//cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.9.3/typeahead.min.js"
と
presenter.js.coffee:
$ ->
$('#presenter_search').typeahead
name: "presenter"
remote: "/presenters/autocomplete?query=%QUERY"
繰り返しますが、私の問題は、名前を入力すると、その名前に一致するすべてのオプションがドロップダウンに表示されますが (姓と名の両方)、スペースを入力するとすぐに候補のリスト全体が表示されることです。離れます。たとえば、「Jennifer H」という名字を検索する方法がありません。問題はコントローラー/オートコンプリートアクションのマッピングにあると推測できますが、次のように入力します。
.map(&:first_name, &:last_name)
また
.map(&:first_name, :last_name)
エラーを生成し、
.map{ |presenter| presenter.slice(:first_name, :last_name) }
ドロップダウンのすべての提案を「未定義」にします。
これを解決する方法について何か提案はありますか?