検索時のサジェスト機能を実装する
HTMLのinput要素の機能を利用する
input要素のlist属性に、入力候補を列記したdatalistのidを指定する。autocomplete属性を"off"にしておくと、入力履歴がサジェストされなくなる。
コード例
<input type="text" autocomplete="on" list="sns"> <datalist id="sns"> <option value="Twitter"></option> <option value="Instagram"></option> <option value="Facebook"></option> </datalist>
実装
次のようにdatalistに投稿タイトルをすべて格納する。
search_index.html.erb
<h1>検索</h1> <%= form_tag("/search/result", data: { turbo: false}) do %> <input type="text" name="word" autocomplete="off" list="post_titles"> <datalist id="post_titles"> <% @posts.each do |post| %> <option value="<%= post.title %>"></option> <% logger.debug(post.title) %> <% end %> </datalist> <input type="submit" value="検索"> <% end %>
search_controller.rb
class SearchController < ApplicationController def search_index @posts = Post.all end def result @posts = Post.where('title like ?', "%#{params[:word]}%") .or(Post.where('content like ?', "%#{params[:word]}%")) .order(created_at: :desc) end end
問題点
検索ページを開いたタイミングで、投稿データをすべてdatalistに入れるので、データ数が多くなると処理が重くなる。